2012-03-15 2 views
0

Этот вопрос кажется действительно базовым, но я не могу найти ответ google, и я провел последний час тестирования без везения. У меня возникают трудности с попыткой вернуть набор строк. Мне нужны строки, равные 11, 1 или Null. Я думаю, что это Null меня перепутал. Ниже всего лишь один из многих тестов, которые я провел ... и я знаю, что это не работает. Любая помощь ДЕЙСТВИТЕЛЬНО оценена. Заранее спасибоsql SELECT возвращает значения, соответствующие NULL ИЛИ Другое значение

SELECT * FROM have 
    WHERE have.flag = 11 || 1 || NULL; 

ответ

4

Вам нужно будет лечить NULL отдельно от 1 и 11, а затем просто положить значения в ваш ИНЕКЕ.

SELECT * 
FROM have AS h 
WHERE h.flag IS NULL 
    OR h.flag IN (1, 11); 
+0

Фактически, '||' означает логический-ИЛИ в MySQL: http://dev.mysql.com/doc/refman/5.5/en/logical-operators.html#operator_or –

+0

@muistooshort Спасибо за ссылку на '||', раньше этого не видел. –

+0

MySQL заставляет вас использовать функцию CONCAT для конкатенации строк, вздоха. –

1

Так же, как альтернатива:

SELECT * 
FROM have 
WHERE nullif(nullif(flag,1),11) IS NULL 
+0

Не влияет ли функция против столбца на использование любого индекса для критериев WHERE? – Ami

+0

Это, как правило, верно, если есть индекс. Не знаете, как MySQL обрабатывает индексы, но Postgres позволяет вам индексировать функции. Тем не менее, я бы пошел с ответом Адама на ясность и эту причину, даже если вопрос не уточнил. - Я только хотел, чтобы этот ответ был образовательной альтернативой. – vol7ron

1

В качестве альтернативы, вы могли бы пойти на

select * from have as h where 
IFNULL(h.flag,1) in (1,11) 
+0

Вы должны изменить первый '11' на' 1', за меньшие символы :) – vol7ron

+0

@ vol7ron Я этого не видел. Благодаря! –

+0

Это ничего не сделает или сломает. Также 'has_flag' можно изменить только на' flag' – vol7ron

1

Это объяснение:

SELECT * FROM have 
    WHERE have.flag = 11 || 1 || NULL; 

То, что вы заявляете, на самом деле :

(have.flag = 11) || 1  || NULL 
true || 1     || NULL 
1       || NULL 
1 


(have.flag = 11) || 1  || NULL 
false || 1     || NULL 
1       || NULL 
1 

Он всегда будет вычисляться 1.
= имеет более высокий приоритет, чем ||.
@ Ответ Адама Венгера правильный.

+0

Правда. Даже в самом простом случае запрос должен быть «WHERE have.flag = 1 || have.flag = 11 || have.flag IS NULL'. Столбец должен быть в каждом условии в критериях «WHERE». – Ami

Смежные вопросы