还有其他方法可以检查可以为空的smth是否等于可以为空的smth吗?

时间:2017-05-04 13:54:49

标签: sql sql-server

我正在尝试在SQL表中插入一些额外的信息

INSERT -smth- INTO teble_name
SELECT DISTINCT -smth-
FROM table_name first
JOIN table_name second ON 
    first.id1 = second.id2
WHERE first.att = second.att

因此,它不起作用,因为att可能是NULLNULL = NULL效果不佳。我还尝试了LIKE而不是=,这对我也没有帮助。还有其他一些方法来检查可以为空的smth是否等于可以为空的smth?

4 个答案:

答案 0 :(得分:1)

除了使用ORIS NULL检查之外,没有其他更好的方法了。

WHERE  first.att = second.att 
OR     (first.att IS NULL AND second.att IS NULL);

您可以尝试缩短为:

WHERE   ISNULL(first.att, '') = ISNULL(second.att, '');

这首先是不一样的,因为它留下first.att实际上是一个emtpy字符串的可能性,因此不应该与second.att的空值匹配。

它也没有效率,所以我会坚持更详细的版本

修改

你实际上可以将它缩短到:

WHERE  first.att = second.att OR ISNULL(first.att, second.att) IS NULL;

但我支持我的第一个论点,你只保存了几个角色,没有任何表现,也没有失去意图。

答案 1 :(得分:0)

您可以这样做:

WHERE coalesce(first.att,-999) = coalesce(second.att,-999)

coalesce将null替换为您指定的值。只需确保指定一个永远不会出现在真实数据中的值。

答案 2 :(得分:0)

试试这个

INSERT INTO teble_name(-smth-)
SELECT DISTINCT -smth-
FROM table_name first
JOIN table_name second ON 
    first.id1 = second.id2
WHERE isnull(first.att,0) = isnull(second.att,0)

答案 3 :(得分:0)

INSERT -smth- INTO teble_name
SELECT DISTINCT -smth-
FROM table_name first
JOIN table_name second ON 
    first.id1 = second.id2
WHERE first.att = second.att OR (first.att IS NULL AND second.att IS NULL )

我的理由是我不会将WHERE子句更改为

WHERE COALESCE(first.att,'Value for null') = COALESCE(second.att,'Value for null')

..如下: -

  • 你最后写的必须为COALESCE函数编写特定类型的代码(如果你的" att"字段是一个字符串,那么第二个参数应该是一个字符串)
  • SQL Server可能会在WHERE子句的第一个版本上发生短路,但在第二个版本上不会发生短路。
  • 你可以打赌你的生活,你所选择的默认值会在它的任务至关重要的时候突然显现它不能和你一直待命