MySQL选择其中列不为空

Posted

技术标签:

【中文标题】MySQL选择其中列不为空【英文标题】:MySQL select where column is not empty 【发布时间】:2010-12-24 13:34:14 【问题描述】:

mysql 中,我可以只选择存在某些内容的列吗?

例如,我有以下查询:

select phone, phone2
from jewishyellow.users
where phone like '813%'
and phone2

我正在尝试仅选择 phone 以 813 开头且 phone2 包含某些内容的行。

【问题讨论】:

你能澄清一下“phone2 里面有东西”是什么意思吗?人们正在猜测您的意思是否是 phone2 IS NOT NULL、不是空白、不是完全空白等等。 如果“某物”存在,显然不为空。 【参考方案1】:

比较phone2 与空字符串的值:

select phone, phone2 
from jewishyellow.users 
where phone like '813%' and phone2<>''

注意NULL 值被解释为false

【讨论】:

单引号,不是双引号。 phone2&lt;&gt;"" 不会通过任何 SQL 语法检查器。 @OMG Ponies:但它适用于 mysql。这是唯一重要的检查器 @ivan:给我的消息,对不起。 与 != 相同。这很简单。但我不知道:)【参考方案2】:

要检查字段是否为 NULL,请使用 IS NULLIS NOT NULL 运算符。

MySql 参考http://dev.mysql.com/doc/refman/5.0/en/working-with-null.html

【讨论】:

OP 只询问在 phone2 字段中有内容的行。 IS NOT NULL 返回字面上未设置为 NULL 的所有内容,甚至是空字符串“”。 !='' 或 '' 正如 Ivan 在接受的答案中所说,不会返回空字符串或 NULL 值。换句话说,IS NOT NULL 是 !='' 的子集,但它们并不等价。【参考方案3】:

检查NULL 和空字符串值:

select phone
, phone2 
from users 
where phone like '813%' 
and trim(coalesce(phone2, '')) <>''

注意我认为 COALESCE() 是 SQL 标准(-ish),而 ISNULL() 不是。

【讨论】:

您不需要使用 trim 函数,因为在 MySQL 中,任意数量空格的字符串等于任意数量空格的另一个字符串,我已经在回答中写了一些细节***.com/a/42723975/728236【参考方案4】:

我一直在使用的一个对我来说效果很好但我还没有在这里看到的答案(这个问题很老了,所以它当时可能没有用)实际上是

SELECT t.phone, 
       t.phone2 
  FROM jewishyellow.users t
 WHERE t.phone LIKE '813%' 
   AND t.phone2 > ''

注意&gt; '' 部分,它将检查值是否不为空,以及该值是否不只是空格或空白。

基本上,如果字段中包含除空格或NULL 之外的其他内容,则为 true。它也非常短,因此很容易编写,并且 COALESCE()IFNULL() 函数的另一个优点是它是索引友好的,因为您不会将字段上的函数输出与任何内容进行比较。

测试用例:

SELECT if(NULL > '','true','false');-- false
SELECT if('' > '','true','false');-- false
SELECT if(' ' > '','true','false');-- false
SELECT if('\n' > '','true','false');-- false
SELECT if('\t' > '','true','false');-- false
SELECT if('Yeet' > '','true','false');-- true

更新有一个我没想到的警告,但是零或以下的数值大于空白字符串,所以 如果您正在处理可能为零或负数的数字,请不要这样做,它最近咬了我一口,很难调试:(

如果您使用的是字符串(char、varchar、text 等),那么这完全没问题,只是要小心使用数字。

【讨论】:

这令人印象深刻。简而言之,不需要函数调用,就可以完成工作。谢谢。 小问题:是否有针对相反条件的类似提示,即如果我需要选择空的东西或NULL?目前我同时使用= ''IS NULL @aexl 很遗憾没那么容易,做not null&gt;'' 返回null 从限制行的角度来看仍然是false 我建议不要将它与 mariadb 一起使用。它比其他选择慢得多。或者,如果对您很重要,至少比较一下性能。【参考方案5】:

如果由于无意的数据输入而在 phone2 字段中存在空格,您可以使用 IFNULL 和 TRIM 函数忽略这些记录:

SELECT phone, phone2
FROM jewishyellow.users
WHERE phone LIKE '813%'
    AND TRIM(IFNULL(phone2,'')) <> '';

【讨论】:

您不需要使用 trim 函数,因为在 MySQL 中,任意数量空格的字符串等于任意数量空格的另一个字符串,我已经在回答中写了一些细节***.com/a/42723975/728236【参考方案6】:
select phone, phone2 from jewishyellow.users 
where phone like '813%' and phone2 is not null

【讨论】:

请注意,NULL 值与空字符串 '' 之间存在差异,后者 值。如果要检查空字符串,请按照其他答案的建议使用 column &lt;&gt; ''【参考方案7】:
SELECT phone, phone2 
FROM jewishyellow.users 
WHERE phone like '813%' and (phone2 <> "");

可能需要一些调整,具体取决于您的默认值。如果允许 Null 填充,则可以改为“Not NULL”,这显然更好。

【讨论】:

我不会标记你,但是:1) MySQL 中没有 NOT() 函数 2) phone2="" 不会通过任何 SQL 语法检查器。 嘿,对不起。我使用了很多不同的 SQL 服务器。【参考方案8】:

另一种选择是专门查看列值的CHAR_LENGTH。 (不要与LENGTH 混淆)

使用字符长度大于 0 的条件将避免在列值可能为假时出现误报,例如在值为 0NULL 的整数列的情况下。在不同的数据类型中表现得更加一致。

这会导致任何值至少为 1 个字符长,否则不为空。

示例 https://www.db-fiddle.com/f/iQvEhY1SH6wfruAvnmWdj5/1

SELECT phone, phone2
FROM users
WHERE phone LIKE '813%'
AND CHAR_LENGTH(phone2) > 0

表格数据

users
phone (varchar 12) | phone2 (int 10)
"813-123-4567"     | NULL
"813-123-4567"     | 1
"813-123-4567"     | 0

users2
phone (varchar 12) | phone2 (varchar 12)
"813-123-4567"     | NULL
"813-123-4567"     | "1"
"813-123-4567"     | "0"
"813-123-4567"     | ""

CHAR_LENGTH(phone2) &gt; 0 结果(相同)

users
813-123-4567       | 1
813-123-4567       | 0

users2
813-123-4567       | 1
813-123-4567       | 0

替代品

phone2 &lt;&gt; '' 结果(不同)

users
813-123-4567       | 1

users2
813-123-4567       | 1
813-123-4567       | 0

phone2 &gt; '' 结果(不同)

users
813-123-4567       | 1

users2
813-123-4567       | 1
813-123-4567       | 0

COALESCE(phone2, '') &lt;&gt; '' 结果(相同) 注意:结果不同于预期的phone2 IS NOT NULL AND phone2 &lt;&gt; ''

users
813-123-4567       | 1
813-123-4567       | 0

users2
813-123-4567       | 1
813-123-4567       | 0

phone2 IS NOT NULL AND phone2 &lt;&gt; '' 结果(不同)

users
813-123-4567       | 1

users2
813-123-4567       | 1
813-123-4567       | 0

【讨论】:

我觉得这是最直观的语法【参考方案9】:

令人惊讶的是(之前没有其他人提到过)发现下面的条件可以完成这项工作:

WHERE ORD(field_to_check) > 0 

当我们需要排除空值和空值时。 有人知道这种方法的缺点吗?

【讨论】:

我已经尝试了好几个小时来让语法正确,这解决了所有问题,谢谢!【参考方案10】:

我们可以使用 CASE 将空白值设置为一些 char 或 String。 我使用 NA 作为默认字符串。

SELECT phone,   
CASE WHEN phone2 = '' THEN 'NA' END AS phone2 ELSE ISNULL(phone2,0) 
FROM jewishyellow.users  WHERE phone LIKE '813%'

【讨论】:

【参考方案11】:

用途:

SELECT t.phone, 
       t.phone2 
  FROM jewishyellow.users t
 WHERE t.phone LIKE '813%' 
   AND t.phone2 IS NOT NULL

【讨论】:

我注意到有时IS NOT NULL 不适用于具有空值的仅字符串列 ('')。我不知道为什么,只是想指出这一点。在检查空字符串列时使用t.phone2 &lt;&gt; '' 更为明智。【参考方案12】:

您可以使用 like 运算符通配符来实现:

SELECT t.phone, 
       t.phone2 
FROM jewishyellow.users t
WHERE t.phone LIKE '813%' 
  AND t.phone2 like '[0-9]';

这样,你可以得到所有有号码前缀的phone2。

【讨论】:

【参考方案13】:

在我的情况下,我有一个 varchar 列,IS NOT NULL!= '' 的两种方法都不起作用,但以下方法对我有用。就放在这里吧。

SELECT * FROM `db_name` WHERE `column_name` LIKE '%*%'

【讨论】:

以上是关于MySQL选择其中列不为空的主要内容,如果未能解决你的问题,请参考以下文章

Mysql查询问题,列不为空插入行的情况

如何使视图列不为空

php mysql批量或批量更新多列和多行但如果列不为空则不更新

SQL:如何在 B 列不为空的情况下使用“100”更新 A 列

数据透视表:隐藏两列不为空的行

选择所有 3 列同时不为空的位置(Laravel 查询生成器)