列等价,包括NULL值

时间:2015-02-27 06:34:28

标签: mysql sql

有没有更好的方法来实现以下目标以获得等效性?

SELECT * FROM table
WHERE
  ((accepted_imdb_url = imdb_url) OR (imdb_url IS NULL and accepted_imdb_url IS NULL))

2 个答案:

答案 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的子句。