我正在尝试在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
可能是NULL
而NULL = NULL
效果不佳。我还尝试了LIKE
而不是=
,这对我也没有帮助。还有其他一些方法来检查可以为空的smth是否等于可以为空的smth?
答案 0 :(得分:1)
除了使用OR
和IS 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')
..如下: -