如果我想检查字段是否包含除null和其他字符以外的其他字符,那么查询是否正确?
select CASE WHEN description IS NULL THEN 'null'
WHEN description IS NOT NULL THEN 'not null' ELSE 'something else' END
AS 'description'from milestone where name like '%Test%' or name like '%test%';
+-------------+
| description |
+-------------+
| not null |
+-------------+
1 row in set (0.00 sec)
答案 0 :(得分:19)
Null和empty表示NULL +''(空字符串)?
select CASE WHEN description IS NULL or description = '' THEN 'null or empty'
ELSE 'not null' END
AS 'description'
在原始查询中,不存在第三种情况,因为IS NULL和IS NOT NULL是互补的,它们之间已经涵盖了所有可能性。
此外,除非你使用区分大小写的排序规则(非常罕见,除非你特别提名,否则永远不会默认排序),MySQL不是Oracle - 这两个查询的工作原理相同:
where name like '%Test%' or name like '%test%'
where name like '%test%'
因为MySQL会不区分大小写匹配字符串
答案 1 :(得分:14)
简单的IF解决方案:
IF (my_field = '', "not null", "null")
顺便说一下,我个人喜欢这样使用它(简写语法):
IF (my_field = '', 1, 0)
答案 2 :(得分:4)
也许你可以尝试这样的事情:
select IF(LENGTH(description) > 0,'not null', 'null or empty') from milestone
答案 3 :(得分:0)
您也可以尝试使用 REGEXP :
// 0 is considered empty
WHERE `field` [NOT] REGEXP '[^0]'
// 0 is not considered empty
WHERE `field` [NOT] REGEXP '[^.]'
答案 4 :(得分:0)
我会创建一个“存储函数”(在MSSQL中称为用户定义函数):
CREATE FUNCTION isNullOrSpaces(s TEXT)
RETURNS BOOLEAN DETERMINISTIC
RETURN (IFNULL(LENGTH(TRIM(s)), 0) = 0);
select
isNullOrSpaces(null) 'null',
isNullOrSpaces('') 'empty string',
isNullOrSpaces(' ') 'spaces',
isNullOrSpaces('
') 'spaces, tab and newline';
请注意,最后一种情况 - 值包含制表符和换行符 - 返回0(FALSE)。这要归功于内置TRIM函数的错误实现(IMHO),它不会删除所有空格。
我本来希望使用函数isNullOrWhiteSpace,但由于这对于很多情况来说已经足够好了,并且正确的TRIM函数的纯SQL实现会很慢,我想这会做。如果你需要处理所有空格,可以考虑将MySQL调用为用户定义的函数(本机函数是一个更好的名称IMO) - 参见例如https://www.codeproject.com/articles/15643/mysql-user-defined-functions。
如果参数为NULL,空或空格,您可能还希望创建一个返回空字符串的版本。这个版本主要用于查询的WHERE或HAVING子句,但除了返回空字符串或原始字符串之外,使其中一个工作相同的唯一困难部分是正确命名函数。像这样:
CREATE FUNCTION trimEx(s TEXT)
RETURNS TEXT DETERMINISTIC
RETURN IF(IFNULL(LENGTH(TRIM(s)), 0) = 0, '', TRIM(s));
select
trimEx(null) 'null',
trimEx('') 'empty string',
trimEx(' ') 'spaces',
trimEx(' not empty ') 'contains text';
答案 5 :(得分:-3)
// checks if the field not null
where field_name !=' '