2015-02-17 3 views
1

Я пытаюсь выполнить запрос, который видит, если поля эквивалентны. Однако, когда поле равно NULL, он возвращает ложный результат. Я даже попытался сделать то же самое с самой колонкой:NULL! = NULL в запросе mysql

SELECT * FROM `mturk_completion` WHERE (`mturk_completion`.`imdb_url` = 
`mturk_completion`.`imdb_url` AND `mturk_completion`.`worker_id` = 'A3NF84Q37D7F35') 

И он возвращает результаты только там, где столбец не равен NULL. Почему это так, и как мне обойти это?

+3

Какое поле, в частности? Кроме того, что подразумевается в этом заявлении «mturk_completion'.'imdb_url' = ' mturk_completion'.'imdb_url'?? Насколько мне известно, содержимое столбца всегда будет равно содержимому того же столбца. –

+1

За исключением случаев, когда столбец содержит значения «NULL». Значения «NULL» не «приравниваются» к другим значениям «NULL». Оператор '=' просто возвращает 'NULL'. –

+0

Это имеет смысл. Спасибо за разъяснение, @HaleemurAli. –

ответ

5

Ваше название является абсолютно правильным для любой реализации SQL (не только MySQL). NULLне равно ни одному (включая другой NULL).

Чтобы установить значение по умолчанию в случае NULL, вам необходимо указать явно IS NULL или COALESCE() function (or its RDBMS-dependent alternatives).

+2

Также оператор [null-safe] (http://dev.mysql.com/doc/refman/5.5/en/comparison-operators.html#operator_equal-to). – sectus

1

Я думаю, что вы можете использовать

(table.Field = table2.Field OR COALESCE(table.Field, table2.Field) IS NULL) 
4

Ваше сравнение mturk_completion.imdb_url само по себе является избыточным и должно всегда возвращаться True, за исключением случаев, когда mturk_completion.imdb_url является Null, и в этом случае он вернется.

Это потому, что оператор = возвращает либо True, False когда сравнения могут быть сделаны или Null, когда любой из двух операторов Null

Попробуйте это, чтобы проиллюстрировать ситуацию.

SELECT 1 = NULL; -- returns NULL 
SELECT 1 != NULL; -- also return NULL 
SELECT ISNULL(1 = NULL); -- returns 1 
SELECT ISNULL(1 != NULL); -- returns 1 

Если переписать запрос, как показано ниже, ваши проблемы с игнорируя NULLs уйдут:

SELECT * FROM `mturk_completion` WHERE worker_id = 'A3NF84Q37D7F35' 
Смежные вопросы