有没有更好的方法来实现以下目标以获得等效性?
SELECT * FROM table
WHERE
((accepted_imdb_url = imdb_url) OR (imdb_url IS NULL and accepted_imdb_url IS NULL))
答案 0 :(得分:5)
标准的SQL答案是使用a IS DISTINCT FROM b
/ a IS NOT DISTINCT FROM b
。但是,MySQL不支持这一点。 MySQL确实支持自己的发明,它实现了同样的效果:<=>
运算符。
SELECT *
FROM table
WHERE accepted_imdb_url <=> imdb_url
答案 1 :(得分:2)
使用COALESCE
:
SELECT *
FROM table
WHERE COALESCE(accepted_imdb_url, '#') = COALESCE(imdb_url, '#')
如果两个字段都不是NULL
,那么上面的WHERE
条款归结为:
WHERE accepted_imdb_url = imdb_url
如果两个字段均为NULL
,则WHERE
子句变为:
WHERE '#' = '#'
如果只有一个NULL
,那么WHERE
相当于:
WHERE accepted_imdb_url = '#'
OR
WHERE '#' = imdb_url
因此,如果url字段的类型为VARCHAR
且这些字段都不等于#
,则建议的WHERE
子句等同于OP的子句。