2011-04-02 249 views
12

如果我想检查字段是否具有除空和空之外的其他字符,查询是否正确?检查字段是否为空

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

那么......其实你可以验证这个在你自己的MySQL ... – RollingBoy 2011-04-02 01:30:51

+0

你认为这是正确的逻辑? – Efox 2011-04-02 01:32:13

+1

(当描述不为NULL时,则'非空',否则'别的'结束)。最后的'其他'永远不会被达到。因为如果描述不为null,它总是碰到'IS NOT NULL'分支。 – RollingBoy 2011-04-02 01:35:48

回答

19

空和空的意思是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将匹配字符串大小写不敏感

0

您也可以尝试使用REGEXP

// 0 is considered empty 
WHERE `field` [NOT] REGEXP '[^0]' 

// 0 is not considered empty 
WHERE `field` [NOT] REGEXP '[^.]' 
13

小号imple IF解决方案:

IF (my_field = '', "not null", "null") 

顺便说一句,我个人比较喜欢使用它像(简写语法):

IF (my_field = '', 1, 0) 
+0

授予这是相当晚,但适合原来的问题,这也将工作︰SELECT IF(描述IS NULL或描述='','空或NULL','存在')AS描述... – fyrye 2013-09-13 01:20:43

-3
// checks if the field not null 
where field_name !=' ' 
+0

在SQL不等于运算符是<>,不是!= – 2013-11-13 10:51:54

4

也许你可以尝试这样的事:

select IF(LENGTH(description) > 0,'not null', 'null or empty') from milestone 
+0

感谢这么简单和优雅的解决方案 这对我来说,当我想在应用'CONCAT_WS'函数之前从字段中删除空字符串。由于此MySQL函数仅在连接之前删除NULL值,而非空值。 这是我的查询的样子,谢谢。 ('LENGTH(field2)> 0,field2,NULL),IF(LENGTH(field3)> 0,field3,NULL))AS'concatenated_field'FROM table'(字段1),CONCAT_WS(',' – 2013-12-26 11:06:56

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函数的错误实现(恕我直言),它不会删除所有的空格。

我本来希望使函数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';