我想编写一条 SELECT 语句,仅使用一个测试来返回没有值(空、空或全部空格)的列。
我认为这会起作用:
SELECT column_name from table_name WHERE column_name NOT LIKE '%_%';
但这不适用于 NULL 值。
当然可以补充
OR column_name IS NULL
它会起作用,但我想要一种使用单个测试的方法。
从功能上来说,你应该能够使用
SELECT column_name
FROM table_name
WHERE TRIM(column_name) IS NULL
问题是不会使用 COLUMN_NAME 上的索引。 如果这是一个选择性条件,您需要在 TRIM(column_name) 上有一个基于函数的索引。
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 ''
NULLIF 函数会将任何只有空格的列值转换为 NULL 值。适用于 T-SQL 和 SQL Server 2008 及更高版本。
SELECT [column_name]
FROM [table_name]
WHERE NULLIF([column_name], '') IS NULL
在检查列的
null or Empty
值时,我注意到各种数据库中存在一些支持问题。
并非所有数据库都支持
TRIM
方法。
下面的矩阵只是为了了解不同数据库支持的方法。
SQL中的TRIM函数用于从字符串中删除指定的前缀或后缀。最常见的被删除的模式是空格。该函数在不同的数据库中调用方式不同:
TRIM(), RTRIM(), LTRIM()
RTRIM(), LTRIM()
TRIM(), RTRIM(), LTRIM()
如何检查空/空/空白:-
以下根据不同的数据库有两种不同的方式-
这些修剪函数的语法是:
使用Trim来检查-
SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL
使用LTRIM & RTRIM来检查-
SELECT FirstName FROM UserDetails WHERE LTRIM(RTRIM(LastName)) IS NULL
以上两种方法提供相同的结果,只需根据您的数据库支持使用即可。如果
FirstName
为空,它只会从 UserDetails
表中返回 LastName
希望这也能帮助其他人:)
此 phpMyAdmin 查询返回那些不为空或空或只是空格的行:
SELECT * FROM `table_name` WHERE NOT ((`column_name` IS NULL) OR (TRIM(`column_name`) LIKE ''))
如果您想选择空/空/只是空格的行,只需删除 NOT。
虽然@MerrickPlainview的答案看起来很接近而且很小,但完整的答案(也按照OP的要求处理空白)将是这样的:
SELECT column_name FROM table_name WHERE NULLIF(TRIM(column_name), '') IS NOT NULL
使用下面的查询,它可以工作
SELECT column_name FROM table_name where isnull(column_name,'') <> ''
我在 T-SQL 中使用的
IsNotNullOrEmptyOrWhiteSpace
是:
SELECT [column_name] FROM [table_name]
WHERE LEN(RTRIM(ISNULL([column_name], ''))) > 0
这涵盖了空和空的空间
TRIM(ColumnName) <> ''
您也可以检查一下。这对我有用,当您想要获取空值和另一个条件时(即我的查询应该返回列名应该为空并且应该包含“questiontext”一词的行)。
SELECT *
FROM `table_name`
WHERE (('columnname' IS NULL) OR (TRIM('columnname') LIKE 'questiontext'))
在这里,我的“columnname”应该等于“questiontext”。
select * from table_name where column_name NOT Like '%_%' 或 列名称为空
这些建议都不适合我。这最终对我有用:
我不确定为什么它不能与
< 1
一起使用,但由于某种原因 < 2
可以工作,并且只返回字段为空的记录。
select [columnName] from [tableName] where LENGTH(columnName) < 2 ;
我猜测用于转换数据的任何脚本都会在该字段中留下一些内容,即使它显示为空白,这就是我的猜测,为什么
< 2
可以工作,但不能 < 1
。
但是,如果该列字段中有任何其他值少于两个字符,那么您可能必须想出另一个解决方案。如果没有很多其他角色,那么你可以单独挑选出来。
为了本网站及其顾客的利益,我不会说任何来自未经允许的来源的言论。不过,我要说的是:真理终将获胜。
非常感谢。
就像在 Oracle 中一样,您可以在 MySQL 中使用 NVL 函数,您可以使用 IFNULL(columnaName, newValue) 来实现您想要的结果,如本例所示
SELECT column_name from table_name WHERE IFNULL(column_name,'') NOT LIKE '%_%';
你可以使用
SELECT [column_name]
FROM [table_name]
WHERE [column_name] LIKE '% %'
OR [column_name] IS NULL