T-SQL:选择不等于值的行,包括空值

Val*_*Val 20 t-sql

如何选择不等于值的行并在返回的数据中包含空值?我试过了:

SET ANSI_NULLS OFF
SELECT TOP 30 FROM Mails
WHERE assignedByTeam <> 'team01'
Run Code Online (Sandbox Code Playgroud)

我想返回没有"team01"列行assignedByTeam但我也希望包含空值的结果.不幸的是,上面的代码不起作用(不返回空值).

我正在使用MS SQL Server 2008 Express.

Mar*_*ers 23

尝试明确检查NULL:

SELECT TOP 30 col1, col2, ..., coln
FROM Mails
WHERE (assignedByTeam <> 'team01' OR assignedByTeam IS NULL)
Run Code Online (Sandbox Code Playgroud)

  • @ValCool:在SQL标准中有一个名为`IS DISTINCT FROM`的运算符,但SQL Server不支持它.MySQL具有非标准的null安全等式运算符`NOT a <=> b`,但SQL Server也不能这样做. (4认同)

小智 14

SELECT TOP 30 FROM Mails
WHERE ISNULL(AssignedByTeam,'') <> 'team01'
Run Code Online (Sandbox Code Playgroud)

我看到了一个coalesce语句版本,但ISNULL()效率更高.

  • 在我看来,这是最优雅的解决方案. (2认同)

小智 11

当你有很多条件时,输入两次就会发臭.以下是两个更好的选择:

SELECT TOP 30 FROM Mails
WHERE COALESCE(assignedByTeam,'') <> 'team01'
Run Code Online (Sandbox Code Playgroud)

COALESCE运算符返回列表中的第一个非空值.如果assignedByTeam为非null,则会将assignedByTeam值与'team01'进行比较.但是如果assignedByTeam为null,它会将空白''与'team01'进行比较.它基本上是以下的简写:

SELECT TOP 30 FROM Mails
WHERE (CASE WHEN assignedByTeam IS NULL THEN '' ELSE assignedByTeam END) <> 'team01'
Run Code Online (Sandbox Code Playgroud)

第二种方法是使条件成为条件,例如:

SELECT TOP 30 FROM Mails
WHERE 1 = CASE WHEN assignedByTeam = 'team01' THEN 0 ELSE 1 END
Run Code Online (Sandbox Code Playgroud)

在此示例中,ELSE值将包括所有空行,因为它们不等于'team01'.