2015-04-24 2 views
0

У меня есть таблица, которая выглядит следующим образом:MySQL: WHERE статус не так, как «пример%» не возвращает результат со статусом NULL

+---------+----------+-----------------+ 
| name | age | status   | 
+---------+----------+-----------------+ 
| Clark | 25  | Example   | 
+---------+----------+-----------------+ 
| Peter | 28  | Example2  | 
+---------+----------+-----------------+ 
| Waldo | 37  | NULL   | 
+---------+----------+-----------------+ 
| Tarzan | 31  | Unknown   | 
+---------+----------+-----------------+ 

Когда я выполнить запрос следующим образом:

SELECT * FROM records WHERE status NOT LIKE 'example%' 

я получаю:

+---------+----------+-----------------+ 
| name | age | status   | 
+---------+----------+-----------------+ 
| Tarzan | 31  | Unknown   | 
+---------+----------+-----------------+ 

Если изменить запрос к (заметьте, что я удалил NOT):

SELECT * FROM records WHERE status LIKE 'example%' 

Затем я получаю следующее:

+---------+----------+-----------------+ 
| name | age | status   | 
+---------+----------+-----------------+ 
| Clark | 25  | Example   | 
+---------+----------+-----------------+ 
| Peter | 28  | Example2  | 
+---------+----------+-----------------+ 

Мой вопрос: где Уолдо?

ответ

1

В SQL NULL значения не могут участвовать в большинстве операций сравнения, в том числе LIKE, вместо этого вы должны рассмотреть NULL значения отдельно с помощью оператора IS NULL:

WHERE (`status` NOT LIKE '%example%' OR `status` IS NULL) 

Это глупо, но это жизнь.

Это описано здесь: https://dev.mysql.com/doc/refman/5.7/en/working-with-null.html

Вы не можете использовать [...] операторы сравнения, такие как =, < или <> для проверки на NULL. Поскольку результат любого [...] сравнения с NULL также является NULL, вы не можете получить каких-либо значимых результатов из таких сравнений.

+0

Ahh, thanks @Dai, я действительно знал ответ уже и просто пытался надеть его на StackOverflow для всех, у кого может быть проблема, но спасибо за правильный ответ в любом случае! Документ, который вы связывали, говорит о операторах сравнения, но не о 'LIKE', который я * думал *, был другой конструкцией. – Bing

0

Я не уверен, почему MySQL не любит обработки LIKE на NULL значения, но решение, которое работало на меня меняется запрос на следующее:

SELECT * FROM records WHERE (status IS NULL OR status NOT LIKE 'example%') 

Я не могу найти любая документация по этому вопросу, поэтому, если у кого-то есть хорошие вещи, пожалуйста, поделитесь ими, но, по крайней мере, это работает.

+0

Такое поведение полностью по дизайну никого не должно удивлять. 'NULL' является заполнителем для отсутствия значения, а значение, которое отсутствует, не может быть правильно названо * любым *, как или иным образом, любым другим значением. Является ли выражение '1> NULL' истинным или ложным? Ответ «нет». Среднее значение (2,0,4), очевидно, равно 2, но среднее значение (2, NULL, 4) равно 3. –

0

Ответ в three valued logic. Предложение WHERE будет фильтровать только строки, где предикат оценивает TRUE. Он будет отфильтровывать строки, где предикат оценивается до FALSE или NULL. Поскольку null like something - NULL, это не будет результатом.

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

  • Нет связанных вопросов^_^