我正在尝试查看字段是否相同的查询。但是,只要字段为NULL,它就会返回错误结果。我甚至尝试用柱本身做同样的事情:
SELECT * FROM `mturk_completion` WHERE (`mturk_completion`.`imdb_url` =
`mturk_completion`.`imdb_url` AND `mturk_completion`.`worker_id` = 'A3NF84Q37D7F35' )
它只返回列不为NULL的结果。为什么会如此,我该如何解决这个问题?
答案 0 :(得分:5)
您的标题对于任何SQL实现(不仅仅是MySQL)都是完全正确的。 NULL
不等于(包括其他NULL
)。
您需要使用明确的IS NULL
检查或COALESCE()
function (or its RDBMS-dependent alternatives)来设置NULL
的默认值。
答案 1 :(得分:4)
您对mturk_completion.imdb_url
与其自身的比较是多余的,并且应始终返回True,除非mturk_completion.imdb_url
为空时,在这种情况下它将返回Null。
这是因为运营商=
在进行比较时会返回True
,False
或Null
,当两个运算符中的任何一个为空时
试试这个来说明情况。
SELECT 1 = NULL; -- returns NULL
SELECT 1 != NULL; -- also return NULL
SELECT ISNULL(1 = NULL); -- returns 1
SELECT ISNULL(1 != NULL); -- returns 1
如果你像下面那样重写你的查询,你忽略NULL的问题就会消失:
SELECT * FROM `mturk_completion` WHERE worker_id = 'A3NF84Q37D7F35'
答案 2 :(得分:1)
我认为你可以使用
(table.Field = table2.Field OR COALESCE(table.Field, table2.Field) IS NULL)