在MySQL中,我可以只在存在某些内容时选择列吗?
例如,我有以下查询:
select phone, phone2
from jewishyellow.users
where phone like '813%'
and phone2
我正在尝试仅选择手机以813开头的行,而phone2中有内容。
答案 0 :(得分:251)
将phone2
的值与空字符串进行比较:
select phone, phone2
from jewishyellow.users
where phone like '813%' and phone2<>''
请注意,NULL
值被解释为false
。
答案 1 :(得分:46)
要检查字段是否为NULL,请使用IS NULL
,IS NOT NULL
运算符。
MySql参考http://dev.mysql.com/doc/refman/5.0/en/working-with-null.html
答案 2 :(得分:30)
检查NULL
并清空字符串值:
select phone
, phone2
from users
where phone like '813%'
and trim(coalesce(phone2, '')) <>''
N.B。我认为COALESCE()是SQL标准(-ish),而ISNULL()不是。
答案 3 :(得分:15)
如果手机2字段中存在空间而无意中输入数据,您可以忽略具有IFNULL和TRIM功能的记录:
SELECT phone, phone2
FROM jewishyellow.users
WHERE phone LIKE '813%'
AND TRIM(IFNULL(phone2,'')) <> '';
答案 4 :(得分:15)
我一直在使用的答案一直很适合我,我在这里没有看到(这个问题已经很老了,所以它可能还没有用)实际上是
SELECT t.phone,
t.phone2
FROM jewishyellow.users t
WHERE t.phone LIKE '813%'
AND t.phone2 > ''
注意> ''
部分,它将检查该值是否为空,以及该值是否只是空格或空白。
基本上,如果字段中除了空格或NULL
之外还有其他内容,则确实如此。它也是超短的,因此它很容易编写,而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等),那么这将完全没问题,只需要注意数字。
答案 5 :(得分:7)
select phone, phone2 from jewishyellow.users
where phone like '813%' and phone2 is not null
答案 6 :(得分:5)
SELECT phone, phone2
FROM jewishyellow.users
WHERE phone like '813%' and (phone2 <> "");
可能需要一些调整,具体取决于您的默认值。如果你允许Null填充,那么你可以改为“Not NULL”,这显然更好。
答案 7 :(得分:2)
我们可以使用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%'
答案 8 :(得分:1)
使用:
SELECT t.phone,
t.phone2
FROM jewishyellow.users t
WHERE t.phone LIKE '813%'
AND t.phone2 IS NOT NULL
答案 9 :(得分:0)
您可以使用like运算符通配符来实现此目的:
SELECT t.phone,
t.phone2
FROM jewishyellow.users t
WHERE t.phone LIKE '813%'
AND t.phone2 like '[0-9]';
通过这种方式,您可以获得所有带有数字前缀的phone2。
答案 10 :(得分:0)
在我的情况下,我有一个varchar列,IS NOT NULL
和!= ''
的两种方法无效,但是以下方法对我有用。只是把它放在这里。
SELECT * FROM `db_name` WHERE `column_name` LIKE '%*%'
答案 11 :(得分:0)
另一种选择是专门查看列值的CHAR_LENGTH
。 (不要与LENGTH
混淆)
使用一个字符长度大于0的条件,可以避免当列值可能为假时(例如,整数列的值为0
或{{1})时出现误报}。在各种数据类型上的表现更加一致。
哪个值的长度至少为1个字符,否则为非空。
NULL
表数据
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
结果(不同)
phone2 > ''
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 <> ''
答案 12 :(得分:0)
令人惊讶的是(正如之前没有人提到的那样)发现以下条件可以完成工作:
WHERE ORD(field_to_check) > 0
当我们需要排除空值和空值时。 有人知道这种方法的弊端吗?