如何在SQL中使用NULL或空字符串

213
我想知道如何在 SQL Server 的 WHERE 子句中同时使用 NULL 和空字符串。我需要找到具有空值或空字符串的记录。谢谢。

5
SQL 中有一个 OR 关键词。 - Robert Harvey
19
这个问题没有展示出任何研究的努力。做好自己的功课是非常重要的。告诉我们你找到了什么,以及为什么这些内容不能满足你的需求。这表明你花时间尝试自己解决问题,它可以避免我们重复显而易见的答案,最重要的是它可以帮助你获得更具体和相关的答案。FAQ - Kermit
1
可能是如何从MySQL表中选择列为空的数据的重复问题(虽然这是一个MySQL问题,但对于t-sql来说,基本上是相同的答案)。 - Michael Berkowski
17个回答

359
Select *
From Table
Where (col is null or col = '')

或者

Select *
From Table
Where IsNull(col, '') = ''

20
根据@Bradc在https://dev59.com/LHRA5IYBdhLWcg3w2x6W?lq=1中的回答,最好使用第一种方法。 - Sameera R.
1
还要注意的是,注释中说,在MSSQL 2016中,在WHERE子句中使用ISNULL与在WHERE子句中使用OR之间没有执行计划差异。据说它们都使用“col”上的索引并进行索引搜索。 - Ε Г И І И О

63
如果您需要在SELECT部分使用它,可以像这样使用。
SELECT ct.ID, 
       ISNULL(NULLIF(ct.LaunchDate, ''), null) [LaunchDate]
FROM   [dbo].[CustomerTable] ct

您可以用您的替换值替换 null


2
Oracle的NVL(var1, 'value')会处理空字符串''的替换。而T-SQL的Isnull(var1, 'value')则不会。 - Jenna Leaf

30
你可以简单地这样做:
SELECT *
FROM   yourTable
WHERE  yourColumn IS NULL OR yourColumn = ''

25
SELECT *
FROM   TableName
WHERE  columnNAme IS NULL OR 
       LTRIM(RTRIM(columnName)) = ''

4
选择所有行并从TableName表中查询,其中columnName列为空或去除空格后等于空字符串。 - Xavier John
3
正如Xavier所指出的那样,如果目标仅是与空字符串进行比较,则无需同时执行ltrimrtrim。原因是:如果只有空格,单个修剪将删除所有空格。例如,您不关心比较失败的原因是剩下了“abc”还是“ abc”。 - ToolmakerSteve
从技术上讲,trim函数删除的是空格而不是空白符——至少文档是这么说的。 - Auspex

8

查找列为NULL、空字符串或空白字符(空格、制表符)的行:

SELECT *
FROM table
WHERE ISNULL(LTRIM(RTRIM(col)),'')=''

查找列为NOT NULL,空字符串或空格(空格、制表符)的行:

SELECT *
FROM table
WHERE ISNULL(LTRIM(RTRIM(col)),'')<>''

8

一些可搜索的方法sargable...

SELECT *
FROM #T
WHERE SomeCol = '' OR SomeCol IS NULL;

SELECT *
FROM #T
WHERE SomeCol = '' 
UNION ALL
SELECT *
FROM #T
WHERE  SomeCol IS NULL;

SELECT *
FROM #T
WHERE EXISTS ((SELECT NULL UNION SELECT '') INTERSECT SELECT SomeCol);

还有一些不可搜索的...

SELECT *
FROM #T
WHERE IIF(SomeCol <> '',0,1) = 1;

SELECT *
FROM #T
WHERE NULLIF(SomeCol,'') IS NULL;

SELECT *
FROM #T
WHERE ISNULL(SomeCol,'') = '';

4

我的最佳解决方案:

 WHERE  
 COALESCE(char_length(fieldValue), 0) = 0

COALESCE函数返回表达式列表中第一个非空值的表达式。

如果fieldValue为空或空字符串,则返回第二个元素,然后返回0。

因此0等于0,则此fieldValue为null或空字符串。

例如,在Python中:

def coalesce(fieldValue):
    if fieldValue in (null,''):
        return 0

祝你好运


3

这是丑陋的MSSQL:

CASE WHEN LTRIM(RTRIM(ISNULL([Address1], ''))) <> '' THEN [Address2] ELSE '' END

3
SELECT *
FROM   Table
WHERE  column like '' or column IS NULL OR LEN(column) = 0

3
你可以使用 isnull 函数来获取文本字段的 null 和空值:
SELECT * FROM myTable
WHERE isnull(my_nullable_text_field,'') = ''

isnull函数字面上只是检查值是否为空。如果字符串为空(“”),它将无法工作。 - Max Pringle
1
@Max Pringle。我没有说过不同的意见。提供的代码也解决了问题。不确定你的贡献是什么,请建议修改而不是投票否定。 - Alberto De Caro
1
我会听取您的建议,我现在已经提出了一个建议性修改。这个where子句只获取null值而不是空字符串值。可以使用nullif来获取空值。 - Max Pringle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接