如何通过一次测试检查null / empty / whitespace值?


88

我想编写一个SELECT语句,该语句仅使用一个测试来返回无值的列(空,空或所有空格)。

我认为这可以工作:

SELECT column_name from table_name WHERE column_name NOT LIKE '%_%';

但这不适用于NULL值。

我当然可以加

OR column_name IS NULL

并且可以使用,但我想使用一种测试方法。



进行多次测试是否可取?即,更细粒度=向用户提供有关如何更正数据的更好反馈。
2010年

@onedaywhen:通常,最好具有更大的粒度,但是我正在使用现有的代码库,因此我想尽可能地模仿现有的代码结构。当前代码仅执行一项测试,因此我正在寻找一种仅进行一项测试的解决方案。
约翰·戈登

Answers:


99

在功能上,您应该可以使用

SELECT column_name
  FROM table_name
 WHERE TRIM(column_name) IS NULL

那里的问题是将不会使用COLUMN_NAME上的索引。如果这是一个选择性条件,则需要在TRIM(column_name)上具有基于函数的索引。


32
对于T-SQL用户请注意:没有TRIM,您将需要LTRIM或RTRIM。
demoncodemonkey

11
SQL Server 2017开始,有TRIM函数。来源
bvwidt

1
@ EhMann365这个问题是关于Oracle,而不是Sql Server。
MH

11
RTRIM(LTRIM(column_name))-适用于Microsft SQL用户。
DxTx

4
在Sql Server中,TRIM(column_name)返回空字符串”,而不是NULL。其他答案都支持空字符串和NULL
Michael Freidgeim

25
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”子句,因为它与空值进行了比较
Harrison 2010年

我不想要''而不是''吗?
约翰·戈登

是的,很抱歉,将原始问题误读为想要所有有价值的东西。但是,正如tanging指出的那样,在Oracle中这似乎行不通。
GendoIkari 2010年

由于我使用的是Oracle,因此看起来可以使用WHERE TRIM(col)IS NULL,它将处理null,空白和空白值。
约翰·戈登

显然,第一部分缺少括号,应该是:WHERE RTRIM(ISNULL(column_name, '')) LIKE ''
Serj Sagan

14

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

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

1
一个好的答案将包含对代码的解释,以及为什么用这种方式编写代码。我建议您更新答案:-)
Qirel

1
这有什么意义?仅将其设置为[column_name] LIKE”
SILENT

它需要TRIM以支持多个空格
Michael Freidgeim

1
在SQL Server 2017上进行测试,这确实适用于没有TRIM的多个空白。这对我来说没有任何意义,因为根据文档NULLIF仅在两个表达式相等时才返回NULL,并且一串空格通常不等于空字符串。(我仅测试了空格,未测试制表符,换行符或其他空白字符。)
Jovie

1
@Jovie SQL服务器有时忽略尾随空白,阅读:stackoverflow.com/questions/17876478/...
布赖恩·麦凯

7

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

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

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

SQL中的TRIM函数用于从字符串中删除指定的前缀或后缀。最常见的模式是空格。在不同的数据库中,此函数的调用方式不同:

  • MySQL: TRIM(), RTRIM(), LTRIM()
  • 甲骨文: RTRIM(), LTRIM()
  • SQL Server: TRIM(), RTRIM(), LTRIM()

如何检查空/空/空白:-

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

这些修剪函数的语法为:

  1. 使用修剪检查-

    SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL

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

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

以上两种方式都可以提供相同的结果,只是基于您的数据库支持而使用。如果它为空,则只返回FirstNamefromUserDetailsLastName

希望这也会对其他人有所帮助:)


用t as(select''c union all select''c union all select NULL)SELECT * FROM t WHERE LTRIM(RTRIM(c))是NULL; 没有在SQL Server上返回3条记录
Waqar,2016年

5
为什么同时需要L和RTRIM?仅一个功能就足以检查列是否为空吗?
SILENT

4

此phpMyAdmin查询返回的行不为null或为空,也不为空格:

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

如果要选择为null / empty /空白的行,则删除NOT。


2

使用下面的查询,它的工作原理

SELECT column_name FROM table_name where isnull(column_name,'') <> ''

0

IsNotNullOrEmptyOrWhiteSpace在T-SQL中使用的是:

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

0

每个建议在Oracle中运行查询以查找其特定字段仅是空白(不包括(空)或任何其他字段而仅是空白行)的记录的建议均无效。我尝试了每个建议的代码。猜猜我将继续在线搜索。

*****更新*****

我尝试了一下,它成功了,不知道为什么<1但由于<2的原因,它为什么不起作用,只返回字段为空的记录

从[tableName]中选择[columnName],其中LENGTH(columnName)<2;

我猜测用于转换数据的任何脚本即使在显示为空白的情况下仍在字段中留下了一些东西,这仍然是我猜测为什么<2有效但不是<1的原因

但是,如果该列字段中的任何其他值小于两个字符,则可能必须提出另一种解决方案。如果没有太多其他字符,则可以将其选中。

希望我的解决方案有一天能帮助别人。


-3

与在Oracle中一样,可以在MySQL中使用NVL函数,可以在本示例中使用IFNULL(columnaName,newValue)来实现所需的结果

SELECT column_name from table_name WHERE IFNULL(column_name,'') NOT LIKE '%_%';

-4

您可以使用

SELECT [column_name] 
FROM [table_name]
WHERE [column_name] LIKE '% %' 
OR [column_name] IS NULL
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.