如何使用单个测试检查null/空/空格值?

120
我想编写一个SELECT语句,只使用一个条件测试就可以返回没有值(null、空或全空格)的列。
我认为这样会起作用:
SELECT column_name from table_name WHERE column_name NOT LIKE '%_%';

但是这对于空值不起作用。

当然,我可以添加

OR column_name IS NULL

它可以工作,但我想找一种只使用一个测试的方法。


1
相关:https://dev59.com/LlHTa4cB1Zd3GeqPRnjt#4042572 - OMG Ponies
有多个测试不是更好吗?即更细粒度=更好的反馈,告诉用户如何纠正数据。 - onedaywhen
@onedaywhen:一般来说,细粒度更好,但我正在使用现有的代码库,并希望尽可能地模仿现有的代码结构。当前代码只执行一个测试,因此我正在寻找一个也只有一个测试的解决方案。 - John Gordon
14个回答

127

从功能上来说,你应该能够使用

SELECT column_name
  FROM table_name
 WHERE TRIM(column_name) IS NULL
问题在于,对于COLUMN_NAME的索引将不会被使用。如果这是一个具有选择性条件的情况,则需要在TRIM(column_name)上创建基于函数的索引。

41
T-SQL用户请注意:没有TRIM函数,您需要使用LTRIM或RTRIM函数。 - demoncodemonkey
17
自从SQL Server 2017版本以后,就有了TRIM函数。来源 - bvwidt
1
@EhMann365 这个问题是关于 Oracle 的,不是 Sql Server。 - M H
15
对于微软 SQL 用户,RTRIM(LTRIM(column_name)) 的作用是去除列(column_name)中的前导和尾随空格。 - DxTx
11
在 SQL Server 中,TRIM(column_name) 返回空字符串 '',而不是 NULL。其他答案支持空字符串和 NULL 两种情况。 - Michael Freidgeim
显示剩余7条评论

34
SELECT column_name from table_name
WHERE RTRIM(ISNULL(column_name, '')) LIKE ''

ISNULL(column_name, '')会在column_name为NULL时返回'',否则返回column_name。

更新

在Oracle中,您可以使用NVL来实现相同的结果。

SELECT column_name from table_name
WHERE RTRIM(NVL(column_name, '')) LIKE ''

3
实际上,这在Oracle中仍然无法运行,因为Oracle将空字符串视为NULL,所以您可能没有“not like ''”的子句,因为它是与null值进行比较。 - Harrison
我是否应该使用 LIKE '' 而不是 NOT LIKE ''? - John Gordon
是的,抱歉,我误读了原始问题,以为想要所有具有值的内容。但正如tanging指出的那样,在Oracle中似乎不起作用。 - GendoIkari
由于我正在使用 Oracle,我看起来可以使用 WHERE TRIM(col) IS NULL 来处理 null、空白和空格值。 - John Gordon
显然,第一部分缺少一个括号,应该是:WHERE RTRIM(ISNULL(column_name, '')) LIKE '' - Serj Sagan
谢谢,我已经修复了。 - GendoIkari

26

NULLIF函数将把任何只含有空格的列值转换为NULL值。适用于T-SQL和SQL Server 2008及以上版本。

SELECT [column_name]
FROM [table_name]
WHERE NULLIF([column_name], '') IS NULL

2
一个好的答案应该包含代码的解释,以及为什么要这样编写。我建议您更新您的答案 :-) - Qirel
1
这样做有什么意义呢?将其设置为 [column_name] LIKE '' 更有效率。 - SILENT
它需要TRIM来支持多个空格。 - Michael Freidgeim
2
在 SQL Server 2017 上进行测试,这可以处理多个空格而无需 TRIM。这对我来说没有意义,因为根据文档,NULLIF 只有在两个表达式相等时才返回 NULL,并且一个空格字符串通常不等于一个空字符串。(我只测试了空格,没有测试制表符、换行符或其他空白字符。) - Dana
1
@Jovie SQL Server有时会忽略尾随空格,请参阅:https://dev59.com/nGMm5IYBdhLWcg3wFL_s - Brian MacKay
这比 trim() 快得多 :) - Avinash Reddy

9

在检查列的null或Empty值时,我注意到各种数据库存在一些支持问题。

并非每个数据库都支持TRIM方法。

以下是矩阵,以了解不同数据库支持的方法。

SQL中的TRIM函数用于从字符串中删除指定的前缀或后缀。最常见的模式是删除空格。这个函数在不同的数据库中被称为不同的名称:

  • MySQL:TRIM(),RTRIM(),LTRIM()
  • Oracle:RTRIM(),LTRIM()
  • SQL Server:TRIM(),RTRIM(),LTRIM()

如何检查Empty/Null/Whitespace:-

根据不同的数据库,以下是两种不同的方法-

这些trim函数的语法是:

  1. 使用Trim检查-

    SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL

  2. 使用LTRIM和RTRIM进行检查-

    SELECT FirstName FROM UserDetails WHERE LTRIM(RTRIM(LastName)) IS NULL

以上两种方法提供相同的结果,只需根据您的数据库支持使用即可。它只是从UserDetails表中返回FirstName,如果它有一个空的LastName

希望这也能帮助其他人 :)


WITH t as ( select ' ' c union all select '' c union all select NULL) SELECT * FROM t WHERE LTRIM(RTRIM(c)) IS NULL; 在SQL服务器上没有返回3条记录。 - Waqar
7
为什么需要同时使用L和RTRIM?只使用一个函数不就足以检查列是否为空吗? - SILENT

6

这个 phpMyAdmin 查询返回的是那些不是 null、空或只包含空格的行:

SELECT * FROM `table_name` WHERE NOT ((`column_name` IS NULL) OR (TRIM(`column_name`) LIKE ''))

如果你想选择空/空白/仅有空格的行,只需删除 NOT。


3
使用以下查询即可:它可以正常工作。
SELECT column_name FROM table_name where isnull(column_name,'') <> ''

3

虽然 @MerrickPlainview 的答案看起来很接近和简短,但完整的答案(也要处理OP所要求的空格)应该是这样的:

SELECT column_name FROM table_name WHERE NULLIF(TRIM(column_name), '') IS NOT NULL

1

在 T-SQL 中,我使用的是 IsNotNullOrEmptyOrWhiteSpace

SELECT [column_name] FROM [table_name]
WHERE LEN(RTRIM(ISNULL([column_name], ''))) > 0

1

这涵盖了空值和空格

TRIM(ColumnName) <> ''

0

你也可以检查一下这个。当你想获取空值和另一个条件(即)我的查询应该返回列名为空并且应该有单词“questiontext”的行时,这对我很有效。

SELECT * 
FROM `table_name` 
WHERE (('columnname' IS NULL) OR (TRIM('columnname') LIKE 'questiontext'))

在这里,我的'columnname'应该等于'questiontext'。


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