在Microsoft SQL中,我有以下声明(粗略地):
UPDATE sometable
SET somecolumn = @somevalue
WHERE somecolumn = NULL;
先前在脚本中设置了 @somevalue
。
运行正常,SQL告诉我零行受影响。有五行是somecolumn是NULL。我做错了什么?
答案 0 :(得分:17)
您必须使用IS NULL来测试列中的NULL值。
UPDATE sometable SET somecolumn = @somevalue WHERE somecolumn IS NULL;
答案 1 :(得分:4)
尝试 IS NULL
UPDATE sometable
SET somecolumn = @somevalue
WHERE somecolumn IS NULL;
来源:http://blogs.msdn.com/b/sqlclr/archive/2005/06/21/431329.aspx
答案 2 :(得分:3)
答案 3 :(得分:1)
ANSI SQL defines NULL不等于任何东西 - 甚至是另一个NULL实例。规范的方法是使用IS NULL
和IS NOT NULL
。
还有MS SQL Server选项SET ANSI_NULLS
。关闭此选项会使WHERE x = NULL
完全符合您的预期。但是,它还会在NULL
之类的查询中包含任何WHERE x <> 'abc'
值 - 这可能不是您所期望的。此选项是特定于连接的,因此更改连接不会影响其他选项。您还可以在数据库级别设置默认设置。创建存储过程时,将在创建时捕获该选项 - 而不是运行时。
另一个技巧是构建像WHERE ISNULL(x, '') = ISNULL(@x, '')
这样的查询。我不认为这是SARGable,所以性能不如WHERE (x IS NULL AND @x IS NULL) OR (x = @x)
好,但是编写和动态构建要好得多。
哦 - 而且,因为我们正在谈论ANSI SQL。 {1}}的ANSI SQL版本为ISNULL
。