2016-02-03 5 views
1

Скажем, у меня есть таблица в SQL-базе данных, какSQL, используя резервный столбец для матча

name age shoesize 
--------------------- 
tom  20  NULL 
dick NULL   4 
harry 30   5 

и я хочу оператор SQL, выбирающий имена, которые имеют возраст == X, или как запасной вариант, если нет такого имена существуют, используйте те, у которых размер обуви == Y. Другими словами, в этой таблице для X = 20, Y = 4 я должен получить только «tom», тогда как для X = 25, Y = 4, я должен получить только ' Дик'. Я не могу этого сделать с

SELECT name FROM table WHERE age = 20 OR shoe size = 4; 

потому что это выберет и тома, и член. Я в настоящее время использую

SELECT COALESCE ((SELECT name FROM tab WHERE age = 20),(SELECT name FROM tab WHERE shoesize = 4)); 

но есть ли более аккуратный способ? Также использование coalesce, как это, не позволяет мне получить всю строку - то есть я не могу использовать SELECT * FROM tab, я могу выбрать только одно имя.

+1

Пометьте свой вопрос в базе данных, которую вы используете. –

+0

Это, как мне кажется, общий вопрос SQL. Я переключаюсь между sqlite, mySQL и Postgres - хотел бы, чтобы он работал во всех из них – user2667066

+0

Я не понимаю, почему X = 20, Y = 4 должен возвращать только «tom», когда «dick» имеет возраст NULL. Вы говорите, что если вы найдете хотя бы одно совпадение с первым условием, вы не хотите проверять второе условие? –

ответ

0

Вы можете использовать ORDER BY и FETCH FIRST 1 ROW ONLY или какой-либо аналогичный пункт:

SELECT name 
FROM tab 
ORDER BY (CASE WHEN age = X THEN 1 
       WHEN shoesize = Y THEN 2 
       ELSE 3 
      END) 
FETCH FIRST 1 ROW ONLY; 

Некоторые базы данных по буквам FETCH FIRST 1 ROW ONLY как LIMIT или TOP или даже что-то другое.

+0

Интересная альтернатива, спасибо. Я не эксперт по SQL, поэтому мне интересно, если ваш оператор замыкается на короткое замыкание, так что размер обуви не проверяется, если существует совпадение по возрасту = X? И ORDER BY медленнее, чем несколько SELECT? – user2667066

+0

@ пользователь2667066. , , Нет короткого замыкания. Независимо от того, выполняется ли один оператор с 'order by' быстрее или медленнее, чем несколько выборок, зависит от размера данных (и, возможно, от других факторов). –