Where子句中的T-SQL变量

时间:2018-04-04 23:47:38

标签: sql-server tsql

我想在这种情况下返回有公司ABC的记录......并且联系人为空。 @Contact为空时,它不会返回任何内容。或者任何变量。想法?

DECLARE @Customer NVARCHAR(40) = 'ABC Company',
        @Contact NVARCHAR(40) = NULL

SELECT
    Company
FROM
    company
WHERE
    contact = @Contact AND customer = @Customer

谢谢, EB

3 个答案:

答案 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)

不会退货。 当您将某个查询作为右操作数时,这一点尤为重要。