如何通过单个测试检查null/empty/whitespace值?

Joh*_*don 74 sql oracle oracle10g

我想编写一个SELECT语句,它只使用一个测试来返回没有值的列(null,empty或所有空格).

我认为这会奏效:

SELECT column_name from table_name WHERE column_name NOT LIKE '%_%';
Run Code Online (Sandbox Code Playgroud)

但这对NULL值不起作用.

我当然可以补充一下

OR column_name IS NULL
Run Code Online (Sandbox Code Playgroud)

它会起作用,但我想要一种使用单一测试的方法.

Jus*_*ave 86

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

SELECT column_name
  FROM table_name
 WHERE TRIM(column_name) IS NULL
Run Code Online (Sandbox Code Playgroud)

问题是不会使用COLUMN_NAME上的索引.如果是选择条件,则需要在TRIM(column_name)上具有基于函数的索引.

  • 对于T-SQL用户的注意事项:没有TRIM,您需要LTRIM或RTRIM. (28认同)
  • RTRIM(LTRIM(column_name)) - 用于Microsft SQL用户. (8认同)
  • 自**SQL Server 2017**以来,有一个TRIM功能.[来源](https://docs.microsoft.com/en-us/sql/t-sql/functions/trim-transact-sql) (7认同)
  • 在 Sql Server 中,TRIM(column_name) 返回空字符串 '',而不是 NULL。其他答案支持空字符串和 NULL (5认同)

Mer*_*iew 18

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

SELECT [column_name]
FROM [table_name]
WHERE NULLIF([column_name], '') IS NULL
Run Code Online (Sandbox Code Playgroud)

  • 一个好的答案将包含对代码的解释,以及为什么这样编写。我建议你更新你的答案:-) (2认同)
  • 在 SQL Server 2017 上测试,这确实适用于没有 TRIM 的多个空格。这对我来说没有意义,因为根据文档 NULLIF 仅当两个表达式相等时才应返回 NULL,并且空格字符串通常不等于空字符串。(我只测试了空格,没有测试制表符、换行符或其他空白字符。) (2认同)

Gen*_*ari 17

SELECT column_name from table_name
WHERE RTRIM(ISNULL(column_name, '')) LIKE ''
Run Code Online (Sandbox Code Playgroud)

ISNULL(column_name, '') 如果column_name为NULL,则返回'',否则返回column_name.

UPDATE

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

SELECT column_name from table_name
WHERE RTRIM(NVL(column_name, '')) LIKE ''
Run Code Online (Sandbox Code Playgroud)

  • 实际上这在Oracle中仍然不起作用,Oracle将空字符串视为NULL,因此您可能没有"不喜欢"的子句,因为它与空值进行比较 (3认同)

Vik*_*dey 6

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

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

下面是了解不同数据库支持的方法的矩阵.

SQL中的TRIM函数用于从字符串中删除指定的前缀或后缀.被删除的最常见模式是白色空间.在不同的数据库中以不同方式调用此函数

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

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

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

这些修剪函数的语法是:

  1. 使用Trim检查 -

    SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL

  2. 使用LTRIM和RTRIM检查 -

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

以上两种方式都可以根据您的DataBase支持提供相同的结果.如果它是空的,它只返回FirstNamefrom UserDetailsLastName

希望这也会帮助别人:)

  • 为什么需要L&RTRIM?不仅有一个函数足以检查列是否为空? (3认同)

小智 6

此 phpMyAdmin 查询返回那些不为空或空或只是空格的行:

SELECT * FROM `table_name` WHERE NOT ((`column_name` IS NULL) OR (TRIM(`column_name`) LIKE ''))
Run Code Online (Sandbox Code Playgroud)

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