如何检查 MySQL 中的列是不是为空或 null?
Posted
技术标签:
【中文标题】如何检查 MySQL 中的列是不是为空或 null?【英文标题】:How do I check if a column is empty or null in MySQL?如何检查 MySQL 中的列是否为空或 null? 【发布时间】:2012-01-18 05:45:54 【问题描述】:我在表中有一个列,其中可能包含空值或空值。如何检查表中存在的行中的列是否为空或 null?
(e.g. null or '' or ' ' or ' ' and ...)
【问题讨论】:
mysql 代码:如果 mycolumn 为空,select isnull(mycolumn) from mytable
返回 1。
length(trim(mycolumn)) > 0 怎么样?
对于 MSSQL > WHERE COLUMN '' OR WHERE LEN(COLUMN) > 0 OR WHERE NULLIF(LTRIM(RTRIM(COLUMN)), '') 不是 NULL
【参考方案1】:
您可以使用WHERE col IS NULL
或WHERE col IS NOT NULL
例如测试列是否为空
SELECT myCol
FROM MyTable
WHERE MyCol IS NULL
在您的示例中,您有各种空白排列。您可以使用TRIM
去除空白,也可以使用COALESCE
将默认值设为NULL(COALESCE 将返回您提供的值中的第一个非空值。
例如
SELECT myCol
FROM MyTable
WHERE TRIM(COALESCE(MyCol, '')) = ''
此最终查询将返回 MyCol
为 null 或任何长度的空格的行。
如果可以避免,最好不要在 WHERE 子句中的列上使用函数,因为这会使使用索引变得困难。如果您只是想检查一列是否为空或为空,您最好这样做:
SELECT myCol
FROM MyTable
WHERE MyCol IS NULL OR MyCol = ''
请参阅TRIMCOALESCE 和IS NULL 了解更多信息。
还有来自 MySQL 文档的 Working with null values
【讨论】:
您以非常复杂的方式呈现真正的解决方案。首先,您对他的问题“mycol 为空”提出了一个不完整的解决方案。然后,您在 where 子句中使用两个嵌套函数提出了一个解决方案,即使说应该避免这种情况。只有这样你才能找到真正的解决方案。将来,首先提出您真正的解决方案。【参考方案2】:如果您希望在执行 ORDER BY 时最后显示 NULL 值,请尝试以下操作:
SELECT * FROM my_table WHERE NULLIF(some_col, '') IS NULL;
【讨论】:
【参考方案3】:试试
SELECT 0 IS NULL , '' IS NULL , NULL IS NULL
-> 0, 0, 1
或
SELECT ISNULL(' ') , ISNULL( NULL )
-> 0 ,1
Reference
【讨论】:
【参考方案4】:检查是否为空
$column is null
isnull($column)
检查是否为空
$column != ""
但是,您应该始终为列设置 NOT NULL,mysql optimization can handle only one IS NULL level
【讨论】:
从不接受NULL
值是另一个完整的讨论主题。我认为不提供您的理由就提出该建议是不合适的。
我确实包括在内,请耐心等待。加上使用 NULL 真的很难(就像这个问题一样)。
这是一个糟糕的建议。在插入时其值可能未知的列上设置 NOT NULL 仅用于鼓励使用非标准“null”值,例如 -1
和 ''
。
@Dan 如果您不确定插入过程中的值是多少,您可能难以进行任何可能的优化【参考方案5】:
这将选择some_col
为NULL
或''
(空字符串)的所有行
SELECT * FROM table WHERE some_col IS NULL OR some_col = '';
【讨论】:
如果您将条件更改为WHERE some_col IS NULL OR some_col = ' '
(在字符串中插入一个空格),那么它适用于 MySQL 和 Oracle,请参阅“onedaywhen”的答案。 some_col = ''
在 Oracle 上不起作用,因为空字符串在那里表示 NULL。
@Johanna 但是如果你切换到' '
,那么它在 SQLite 中将不起作用。它只处理相同/直接的字符串匹配。【参考方案6】:
根据 SQL-92 标准的定义,当比较两个不同宽度的字符串时,较窄的值会在右边用空格填充,以使其与较宽的值具有相同的宽度。因此,所有完全由空格(包括零空格)组成的字符串值将被视为相等,例如
'' = ' ' IS TRUE
'' = ' ' IS TRUE
' ' = ' ' IS TRUE
' ' = ' ' IS TRUE
etc
因此,无论some_col
值有多少个空格,这都应该有效:
SELECT *
FROM T
WHERE some_col IS NULL
OR some_col = ' ';
或更简洁:
SELECT *
FROM T
WHERE NULLIF(some_col, ' ') IS NULL;
【讨论】:
感谢您提及填充空间。您可以从中获利并将条件更改为WHERE some_col IS NULL OR some_col = ' '
(在字符串中插入一个空格),然后它适用于 MySQL 和 Oracle。 some_col = ''
在 Oracle 上不起作用,因为空字符串在此处表示 NULL,并且完整条件变为 NULL。
我的要求是找到在 MySQL 中为我工作的 SELECT * FROM T WHERE some_col IS NOT NULL OR same_col <> ' ';
和 SELECT * FROM T WHERE NULLIF(some_col, ' ') IS NOT NULL;
。希望这会有用。
实际上 '' = ' '
在 SQLServer 中有效,但在 SQLite 中无效,据我所知,从现在测试来看。【参考方案7】:
写条件的更短方式:
WHERE some_col > ''
由于null > ''
产生unknown
,这具有过滤掉null
和空字符串的效果。
【讨论】:
有没有办法获得相反的结果,获取所有为 NULL 或空字符串的记录? @JoshPinter:coalesce(some_col, '') = ''
这在某些时候可能是正确的,但在 MySQL 14.14 中不起作用。
效果很好,实际上是我弄清楚如何过滤掉 MariaDB 中的空字段和空字段的唯一方法
我用 some_col '' 来找到它的反面【参考方案8】:
我讨厌数据库中杂乱的字段。如果该列可能是空白字符串或 null,我宁愿在每次进行选择之前修复此问题,如下所示:
UPDATE MyTable SET MyColumn=NULL WHERE MyColumn='';
SELECT * FROM MyTable WHERE MyColumn IS NULL
这可以保持数据整洁,只要您出于某种原因不需要特别区分 NULL 和空即可。
【讨论】:
一次性修复很有趣。或偶尔的维护操作。但是当数据库处于活动状态时它是不切实际的 - UPDATE 必须锁定表(以保持一致性)。如果其他人需要访问同一张表,那将降低性能。然后不能保证其他人不会在 UPDATE 完成后立即创建包含空白的记录。这是一个滑坡。【参考方案9】:没有WHERE的另一种方法,试试这个..
将同时选择 Empty 和 NULL 值
SELECT ISNULL(NULLIF(fieldname,'')) FROM tablename
【讨论】:
如果有 null 则返回 1,为什么会这样? NULLIF 检查字段名是否为空值,如果为空则转换为 NULL。如果 NULLIF 成功地将一个空字段更改为 NULL 或者它已经是 NULL,则 ISNULL 返回 1(真)......尝试使用两个函数分隔的表中的一个空字段和空字段为您自己选择 isnull (X) , 选择 nullif(y)【参考方案10】:这句话对我来说更清晰,更易读:
select * from my_table where ISNULL(NULLIF(some_col, ''));
【讨论】:
【参考方案11】:在我的项目中检查null or Empty
列的值时,我注意到各种数据库中存在一些支持问题。
每个数据库都不支持 TRIM
方法。
下面的矩阵只是为了了解不同数据库支持的方法。
SQL 中的 TRIM 函数用于从字符串中删除指定的前缀或后缀。被删除的最常见模式是空格。该函数在不同数据库中的调用方式不同:
MySQL:TRIM(), RTRIM(), LTRIM()
甲骨文: RTRIM(), LTRIM()
SQL 服务器: RTRIM(), LTRIM()
如何检查 Empty/Null :-
下面是根据不同数据库的两种不同方式-
这些修剪函数的语法是:
使用Trim进行检查-
SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL
使用 LTRIM 和 RTRIM 进行检查-
SELECT FirstName FROM UserDetails WHERE LTRIM(RTRIM(LastName)) IS NULL
以上两种方式都提供相同的结果,只是根据您的数据库支持使用。它只是从UserDetails
表中返回FirstName
,如果它有一个空的LastName
希望对您有所帮助:)
【讨论】:
【参考方案12】:如果数据类型为字符串且行为空,请尝试此操作
SELECT * FROM table WHERE column_name IS NULL OR column_name = ''
如果数据类型是 int 或列是 0,那么试试这个
SELECT * FROM table WHERE column_name > = 0
【讨论】:
【参考方案13】:SELECT column_name FROM table_name WHERE column_name IN (NULL, '')
【讨论】:
错误答案。这不会选择NULL
。
澄清@Pang 的评论:不能在表达式中使用NULL,就好像它是一个值一样。您必须进行特殊测试,例如 ... IS NULL
或 ISNULL(...)
请注意,代码示例永远不会说 column_name = NULL
。它只是不那样工作。【参考方案14】:
要么
SELECT IF(field1 IS NULL or field1 = '', 'empty', field1) as field1 from tablename
或
SELECT case when field1 IS NULL or field1 = ''
then 'empty'
else field1
end as field1 from tablename
【讨论】:
【参考方案15】:你也可以这样做
SELECT * FROM table WHERE column_name LIKE ''
倒数
SELECT * FROM table WHERE column_name NOT LIKE ''
【讨论】:
显然不起作用:select NULL like ''
返回NULL
- 至少在 MySQL 中。
性能:不要将LIKE
用于没有它也可以完成的表达式。【参考方案16】:
select * from table where length(RTRIM(LTRIM(column_name))) > 0
【讨论】:
同时使用RTRIM
和LTRIM
而不使用TRIM
有什么意义?
我觉得它很有趣,但不推荐;) - 占用了太多资源/时间。【参考方案17】:
SELECT * FROM tbl WHERE trim(IFNULL(col,'')) <> '';
【讨论】:
与有时为空的字段相比,我遇到了问题。这有帮助:col1 != IFNULL(col2,'')
FWIW:字符串不可能小于空字符串,因此可以使用<>
代替>
。
我发现使用 TRIM 比 '' 等使用更多资源(需要更多时间)。当然,如果没有必要,虽然它正在工作,但不要使用它。【参考方案18】:
在我的例子中,在数据导入期间在列中输入了空格,虽然它看起来像一个空列,但它的长度是 1。所以首先我使用 length(column)
检查了空列的长度,然后基于这个我们可以写搜索查询
从 LENGHT(COLUMN)= 0 的表中选择 *;
【讨论】:
嗯?我不明白那个代码 sn-p 说什么。你是想说LENGTH(column)=0
吗?【参考方案19】:
获取NULL, 0, '', ' ', ' '的行
SELECT * FROM table WHERE some_col IS NOT TRUE;
获取不带NULL、0、''、''、''的行
SELECT * FROM table WHERE some_col IS TRUE;
【讨论】:
我认为这行不通。SELECT 'abc' <> '', 'abc' IS TRUE;
返回 1
和 0
。【参考方案20】:
我的两分钱。
在 MySQL 中你可以使用COALESCE
函数:
返回列表中的第一个非 NULL 值,如果没有非 NULL 值,则返回 NULL。
所以你可以像这样简化你的查询:
SELECT * FROM table WHERE COALESCE(some_col, '') = '';
【讨论】:
以上是关于如何检查 MySQL 中的列是不是为空或 null?的主要内容,如果未能解决你的问题,请参考以下文章