我正在研究一个更大的问题,但已将其缩小到这个范围,以便更容易提出这个问题。
以下查询:
Select * from User where Country = Country
仅返回Country不为null的行。我希望如果Column1为null,它将返回它,因为NULL = NULL。
关于为什么这不符合预期的任何输入?
编辑:
我正在尝试这样做:
Select * from User where Country = coalesce(@Country, Country)
如果我的变量@Country为null,我希望它能拉出所有内容。
答案 0 :(得分:5)
SQL使用three valued logic(true
,false
,unknown
)并与NULL
进行比较(使用IS [NOT] NULL
运算符进行测试除外)只要会话选项ANSI_NULLS
已启用,评估为unknown
而非true
。
要从查询中返回一行,WHERE
子句需要评估为true
。
编辑后,您可以使用
Select *
from User
where @Country is null or Country = @Country
option (recompile)
在@country is null
时返回所有行。虽然最好将这些分解为2个案例以避免重新编译惩罚。
IF @Country is null
Select *
from User
ELSE
Select *
from User
Where Country = @Country
答案 1 :(得分:1)
NULL永远不会等于NULL,所以当Country为NULL时,Country!= Country
使用IS运算符测试NULL。
如果你真的想要NULLS(我真的不明白为什么你;首先想要这样的查询),那就试试..
select * from User where IFNULL(Country, '') = IFNULL(Country, '')
或
select * from User where Country = Country or Country IS NULL