我想在这种情况下返回有公司ABC的记录......并且联系人为空。 @Contact
为空时,它不会返回任何内容。或者任何变量。想法?
DECLARE @Customer NVARCHAR(40) = 'ABC Company',
@Contact NVARCHAR(40) = NULL
SELECT
Company
FROM
company
WHERE
contact = @Contact AND customer = @Customer
谢谢, EB
答案 0 :(得分:4)
NULL是特殊的,因为它意味着UNKNOWN。
已知值(联系人)永远不能等于未知值。您需要一个OR语句来检查它是否等于OR
where (contact = @Contact OR (contact is null AND @Contact is null))
and customer = @Customer
也许是这样的?
答案 1 :(得分:0)
你可以写
WHERE
ISNULL(contact,'') = ISNULL(@Contact,'') AND customer = @Customer
这会进行空检查,如果为null,则将该值视为空字符串以进行比较。
而不是null == null(假设为false),'' ==''将会进行。
if(null =null)
print 'Equal'
else
print 'not equal'
/ ********** /
if('' ='')
print 'Equal'
else
print 'not equal'
答案 2 :(得分:0)
在SQL中,应用了三价逻辑。在this reference中,您可以详细了解此类逻辑。底线是,在true和false之间,还有另一个值:UNKNOWNN
,(在SQL中)是与NULL
值进行比较的结果。你可以认为它是假的(在这种情况下)。
现在,想象一下:
此查询不会返回任何内容,因为where
子句的计算结果为UNKNOWN
:
select 1 where null = 0
select 1 where null <> 0
select 1 where null = null
虽然这可能很明显,但有后果:,当您使用not in
运算符时。
当右操作数包含NULL
时,查询将不返回任何记录,例如:
select 1 where 0 not in (null, 1, 2)
不会退货。 当您将某个查询作为右操作数时,这一点尤为重要。