2016-11-18 2 views
2

Это меня озадачивает. У меня есть следующий запрос:WHERE is NULL clause return NON NULL Значения

SELECT * 
    FROM table.contract 
WHERE end_date IS NULL 
    AND LOWER(NAME) LIKE 'name' 
    OR LOWER(NAME) LIKE '%name1%' 
    OR LOWER(NAME) LIKE '%name2%' 

Как и должно быть, он должен возвращать только строки, где END_DATE является NULL, но я получаю строки, имеющие дату в них.

Тип данных - DATE, а значение по умолчанию - (null), поэтому я не знаю, почему он возвращает некоторые строки с датами. У меня просто мозговой пердит? Это пятница, поэтому я приношу свои извинения, если мне не хватает чего-то простого.

Любая помощь была бы принята с благодарностью!

EDIT: Я довольно идиот. Я забыл свою скобку, код должен выглядеть следующим образом:

SELECT * 
    FROM table.contract 
WHERE end_date IS NULL 
    AND (LOWER(NAME) LIKE 'name' 
    OR LOWER(NAME) LIKE '%name1%' 
    OR LOWER(NAME) LIKE '%name2%') 
+5

Вы можете быть заинтересованы в приоритете операций – Mihai

+3

У вас есть или в списке фильтров. Думаю, вы хотели где-то использовать скобки. –

+7

Подсказка: в чем разница между 1 + 1 * 8 и (1 + 1) * 8? – dfundako

ответ

1

вы, кажется, отсутствуют некоторые(), чтобы обеспечить правильную precendence между вашим «И» с и вашим «ИЛИ» с.

например

SELECT * 
    FROM table.contract 
WHERE end_date IS NULL 
    AND (LOWER(NAME) LIKE 'name' 
    OR LOWER(NAME) LIKE '%name1%' 
    OR LOWER(NAME) LIKE '%name2%') 
Смежные вопросы