2011-04-02 20 views
12

¿Es correcta la consulta si quería verificar si el campo tiene otros caracteres que no sean nulos y vacíos?Campo de verificación si está vacío

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

Bueno ... de hecho, puede verificar esto en su propio MySQL ... – RollingBoy

+0

¿Cuál cree que es esta la lógica correcta? – Efox

+1

(CUANDO la descripción NO ES NULA ENTONCES 'no es nulo' ELSE 'algo más' END). El último 'else' nunca será alcanzado. Porque si la descripción no es nula, siempre golpea la rama 'IS NOT NULL'. – RollingBoy

Respuesta

19

Nulo y vacío significa NULL + '' (cadena vacía)?

select CASE WHEN description IS NULL or description = '' THEN 'null or empty' 
    ELSE 'not null' END 
    AS 'description' 

En su búsqueda original, no hay posibilidad de un tercer caso porque IS NULL e IS NOT NULL son complementarios, entre ellos que han cubierto todas las posibilidades.

También, a menos que esté utilizando mayúsculas y minúsculas de colación (muy raro, y nunca por defecto a menos que usted nombre en concreto uno), MySQL no es Oracle - estas dos consultas funcionarán de la misma:

where name like '%Test%' or name like '%test%' 
where name like '%test%' 

Debido MySQL coincidirá con cadenas de mayúsculas y minúsculas

0

también puede tratar de utilizar REGEXP:

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

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

S imple SI solución:

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

Por cierto, personalmente me gusta usarlo como que (sintaxis abreviada):

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

De acuerdo, esto es bastante tarde, pero para encajar con la pregunta original, esto también funcionaría: SELECCIONE IF (descripción IS NULL O description = '', 'Vacío o NULO', 'Existe') AS description ... – fyrye

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

En SQL el operador no es igual <>, no! = –

4

Tal vez usted puede intentar algo como esto:

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

gracias a una solución tan simple y elegante Esto funcionó para mí cuando quise eliminar cadenas vacías de los campos antes de aplicar la función 'CONCAT_WS'. Como esta función MySQL solo elimina valores 'NULL' antes de concatenar, no valores vacíos. Así se veía mi consulta, muchas gracias. 'SELECCIONE field1, CONCAT_WS (',', IF (LENGTH (field2)> 0, field2, NULL), IF (LENGTH (field3)> 0, field3, NULL)) AS 'concatenated_field' FROM table' –

0

Crearía una "función almacenada" (lo que en MSSQL se llama una función definida por el usuario):

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'; 

Tenga en cuenta que el último caso, donde el valor contiene pestañas y saltos, devuelve 0 (FALSO). Esto es gracias a una mala implementación (en mi humilde opinión) de la función TRIM incorporada, que no elimina todos los espacios en blanco.

Hubiera preferido hacer la función isNullOrWhiteSpace, pero como esto es suficiente para muchos casos y una implementación de SQL puro de una función TRIM adecuada será lenta, pensé que esto funcionaría. Si necesita manejar todos los espacios en blanco, considere hacer lo que MySQL llama una función definida por el usuario (la función nativa es un nombre mejor IMO) - vea por ejemplo https://www.codeproject.com/articles/15643/mysql-user-defined-functions.

Es posible que también desee crear una versión que devuelva una cadena vacía si el argumento es NULO, está vacío o tiene espacios. Esta versión es principalmente útil para las cláusulas WHERE o HAVING de una consulta, pero la única parte difícil de hacer una que funcione igual excepto que se devuelva una cadena vacía o la cadena original es asignarle un nombre apropiado a la función ...! Algo así:

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'; 
Cuestiones relacionadas