在MySQL中,我可以仅在存在某些内容时选择列吗?
例如,我有以下查询:
select phone, phone2 from jewishyellow.users where phone like '813%' and phone2
我正在尝试仅选择电话以813开头的行,而phone2中有一些内容 .
将 phone2 的值与空字符串进行比较:
phone2
select phone, phone2 from jewishyellow.users where phone like '813%' and phone2<>''
请注意, NULL 值被解释为 false .
NULL
false
要检查字段是否为NULL,请使用 IS NULL , IS NOT NULL 运算符 .
IS NULL
IS NOT NULL
MySql参考http://dev.mysql.com/doc/refman/5.0/en/working-with-null.html
检查 NULL 并清空字符串值:
select phone , phone2 from users where phone like '813%' and trim(coalesce(phone2, '')) <>''
注:我认为COALESCE()是SQL标准(-ish),而ISNULL()则不是 .
如果phone2字段中存在来自意外数据输入的空格,则可以忽略具有IFNULL和TRIM功能的那些记录:
SELECT phone, phone2 FROM jewishyellow.users WHERE phone LIKE '813%' AND TRIM(IFNULL(phone2,'')) <> '';
我一直在使用的答案一直很适合我,我还没有看到这里(这个问题已经很老了,所以它可能还没有工作)实际上是
SELECT t.phone, t.phone2 FROM jewishyellow.users t WHERE t.phone LIKE '813%' AND t.phone2 > ''
注意 > '' 部分,它将检查该值是否为空,以及该值是否只是空格或空白 .
> ''
基本上,如果字段中除了空格或 NULL 之外还有其他内容,则确实如此 . 它易于编写,而 COALESCE() 和 IFNULL() 函数的另一个优点是它是索引友好的,因为你不是将字段上函数的输出与任何东西进行比较 .
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
UPDATE 有一点需要注意,我没想到,但零或以下的数值不大于一个空白字符串,所以 if you're dealing with numbers that can be zero or negative than DO NOT DO THIS ,它最近让我感到困扰并且很难调试:(
如果你正在使用字符串(char,varchar,text等),那么这将是完美的,只需要小心数字 .
select phone, phone2 from jewishyellow.users where phone like '813%' and phone2 is not null
SELECT phone, phone2 FROM jewishyellow.users WHERE phone like '813%' and (phone2 <> "");
可能需要一些调整,具体取决于您的默认值 . 如果你允许Null填充,那么你可以改为“Not NULL”,这显然更好 .
我们可以使用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%'
使用:
SELECT t.phone, t.phone2 FROM jewishyellow.users t WHERE t.phone LIKE '813%' AND t.phone2 IS NOT NULL
您可以使用like运算符通配符来实现此目的:
SELECT t.phone, t.phone2 FROM jewishyellow.users t WHERE t.phone LIKE '813%' AND t.phone2 like '[0-9]';
通过这种方式,您可以获得所有具有数字前缀的phone2 .
10 回答
将
phone2
的值与空字符串进行比较:请注意,
NULL
值被解释为false
.要检查字段是否为NULL,请使用
IS NULL
,IS NOT NULL
运算符 .MySql参考http://dev.mysql.com/doc/refman/5.0/en/working-with-null.html
检查
NULL
并清空字符串值:注:我认为COALESCE()是SQL标准(-ish),而ISNULL()则不是 .
如果phone2字段中存在来自意外数据输入的空格,则可以忽略具有IFNULL和TRIM功能的那些记录:
我一直在使用的答案一直很适合我,我还没有看到这里(这个问题已经很老了,所以它可能还没有工作)实际上是
注意
> ''
部分,它将检查该值是否为空,以及该值是否只是空格或空白 .基本上,如果字段中除了空格或
NULL
之外还有其他内容,则确实如此 . 它易于编写,而COALESCE()
和IFNULL()
函数的另一个优点是它是索引友好的,因为你不是将字段上函数的输出与任何东西进行比较 .测试用例:
UPDATE 有一点需要注意,我没想到,但零或以下的数值不大于一个空白字符串,所以 if you're dealing with numbers that can be zero or negative than DO NOT DO THIS ,它最近让我感到困扰并且很难调试:(
如果你正在使用字符串(char,varchar,text等),那么这将是完美的,只需要小心数字 .
可能需要一些调整,具体取决于您的默认值 . 如果你允许Null填充,那么你可以改为“Not NULL”,这显然更好 .
我们可以使用CASE将空值设置为某些char或String . 我使用NA作为默认字符串 .
使用:
您可以使用like运算符通配符来实现此目的:
通过这种方式,您可以获得所有具有数字前缀的phone2 .