如何通过单个测试检查 null/空/空白值?

问题描述 投票:0回答:15

我想编写一条 SELECT 语句,仅使用一个测试来返回没有值(空、空或全部空格)的列。

我认为这会起作用:

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

但这不适用于 NULL 值。

当然可以补充

OR column_name IS NULL

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

sql oracle oracle10g
15个回答
128
投票

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

SELECT column_name
  FROM table_name
 WHERE TRIM(column_name) IS NULL

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


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 ''

27
投票

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

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

9
投票

在检查列的

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

以上两种方法提供相同的结果,只需根据您的数据库支持使用即可。如果

FirstName
 为空,它只会从 
UserDetails
表中返回
LastName

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


6
投票

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

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

如果您想选择空/空/只是空格的行,只需删除 NOT。


4
投票

虽然@MerrickPlainview的答案看起来很接近而且很小,但完整的答案(也按照OP的要求处理空白)将是这样的:

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

3
投票

使用下面的查询,它可以工作

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

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”。


0
投票

select * from table_name where column_name NOT Like '%_%' 或 列名称为空


0
投票

这些建议都不适合我。这最终对我有用:

我不确定为什么它不能与

< 1
一起使用,但由于某种原因
< 2
可以工作,并且只返回字段为空的记录。

select [columnName] from [tableName] where LENGTH(columnName) < 2 ;

我猜测用于转换数据的任何脚本都会在该字段中留下一些内容,即使它显示为空白,这就是我的猜测,为什么

< 2
可以工作,但不能
< 1

但是,如果该列字段中有任何其他值少于两个字符,那么您可能必须想出另一个解决方案。如果没有很多其他角色,那么你可以单独挑选出来。


0
投票

为了本网站及其顾客的利益,我不会说任何来自未经允许的来源的言论。不过,我要说的是:真理终将获胜。

非常感谢。


-3
投票

就像在 Oracle 中一样,您可以在 MySQL 中使用 NVL 函数,您可以使用 IFNULL(columnaName, newValue) 来实现您想要的结果,如本例所示

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

-6
投票

你可以使用

SELECT [column_name] 
FROM [table_name]
WHERE [column_name] LIKE '% %' 
OR [column_name] IS NULL
© www.soinside.com 2019 - 2024. All rights reserved.