在MySQL,我可以选择列只存在的东西吗?

例如,我有以下查询:

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

我试图只选择电话以813开始的行,电话2有一些东西在里面。


当前回答

Use:

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

其他回答

另一种替代方法是专门查看列值的CHAR_LENGTH。(不要与长度混淆)

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

这将导致至少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) > 0

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

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

选择

phone2 <> "结果(不同)

users
813-123-4567       | 1

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

结果(不同)

users
813-123-4567       | 1

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

COALESCE(phone2, ") <> "结果(相同) 注意:结果不同于phone2 IS NOT NULL AND phone2 <> ",这不是预期的

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

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

phone2 IS NOT NULL AND phone2 <> "结果(不同)

users
813-123-4567       | 1

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

在我的情况下,我有一个varchar列,两个方法的IS NOT NULL & != "没有工作,但以下工作为我。把这个写出来。

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

要检查字段是否为空,请使用is NULL, is NOT NULL操作符。

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

我一直在用的一个对我很有效的答案是,我在这里没有看到(这个问题很老了,所以它可能没有起作用)

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

注意> "部分,它将检查值是否为空,以及值是否为空白或空白。

基本上,如果字段中有空白或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等),那么这将是完美的,只是要小心数字。

SELECT phone, phone2 
FROM jewishyellow.users 
WHERE phone like '813%' and (phone2 <> "");

可能需要一些调整,这取决于您的默认值是什么。如果你允许Null填充,那么你可以做“Not Null”代替,这显然更好。