MySQL selecciona donde la columna no está vacía

182

En MySQL, ¿puedo seleccionar columnas solo donde algo existe?

Por ejemplo, tengo la siguiente consulta:

select phone, phone2
from jewishyellow.users
where phone like '813%'
and phone2

Estoy tratando de seleccionar solo las filas donde el teléfono comienza con 813 y phone2 tiene algo.

Miguel
fuente
2
¿Puedes aclarar lo que quieres decir con " phone2tiene algo en él"? La gente está tomando conjeturas en cuanto a si nos referimos phone2no es nulo, no está en blanco, no es exclusivamente un espacio en blanco, etc.
Pilcrow
1
si existe "algo", obviamente no es nulo.
mike

Respuestas:

277

Compare el valor de phone2con una cadena vacía:

select phone, phone2 
from jewishyellow.users 
where phone like '813%' and phone2<>''

Tenga en cuenta que el NULLvalor se interpreta como false.

Ivan Nevostruev
fuente
55
Comillas simples, no comillas dobles.
OMG Ponies
2
phone2<>""no pasará ningún comprobador de sintaxis SQL.
OMG Ponies
55
@OMG Ponies: Pero funciona en mysql. Este es el único corrector que importa
Ivan Nevostruev
77
@ivan: Noticias para mí, perdón por eso.
OMG Ponies
<> es igual que! =. Fue simple. pero no sabía :)
MFarooqi
48

Para verificar si el campo es NULL IS NULL, use IS NOT NULLoperadores.

Referencia de MySql http://dev.mysql.com/doc/refman/5.0/en/working-with-null.html

Stanislav Stoyanov
fuente
10
OP pregunta solo por las filas que tienen algo en el campo phone2. IS NOT NULL devuelve todo lo que literalmente no está establecido en NULL, incluso la cadena vacía "". ! = '', o <> '' como dijo Ivan en la respuesta aceptada, no devolverá cadenas vacías o valores NULL. En otras palabras, IS NOT NULL es un subconjunto de! = '', Pero no son equivalentes.
Ninguno
34

Verifique NULLy vacíe los valores de cadena:

select phone
, phone2 
from users 
where phone like '813%' 
and trim(coalesce(phone2, '')) <>''

Nota: creo que COALESCE () es el estándar SQL (-ish), mientras que ISNULL () no lo es.

davek
fuente
1
No necesita usar la función de recorte, ya que en MySQL una cadena de cualquier número de espacios es igual a otra cadena de cualquier número de espacios, he escrito en respuesta sobre esto con bastante detalle stackoverflow.com/a/ 42723975/728236
Brian Leishman
26

Una respuesta que he estado usando que me ha funcionado bastante bien y que no había visto aquí (esta pregunta es muy antigua, por lo que puede que no haya funcionado) es

SELECT t.phone, 
       t.phone2 
  FROM jewishyellow.users t
 WHERE t.phone LIKE '813%' 
   AND t.phone2 > ''

Observe la > ''parte, que verificará si el valor no es nulo y si el valor no es solo un espacio en blanco o en blanco.

Básicamente, si el campo tiene algo diferente al espacio en blanco o NULL, es cierto. También es súper corto, por lo que es fácil de escribir y otra ventaja sobre COALESCE()yIFNULL() funciones es que es amigable con el índice, ya que no está comparando el resultado de una función en un campo con nada.

Casos de prueba:

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

ACTUALIZACIÓN Hay una advertencia sobre esto que no esperaba, pero los valores numéricos que son cero o inferiores no son mayores que una cadena en blanco, por lo que si se trata de números que pueden ser cero o negativos, NO HAGA ESTO , me mordió muy recientemente y fue muy difícil de depurar :(

Si está utilizando cadenas (char, varchar, text, etc.), esto estará perfectamente bien, solo tenga cuidado con los números.

Brian Leishman
fuente
17

Si hay espacios en el campo phone2 desde la entrada de datos involuntaria, puede ignorar esos registros con las funciones IFNULL y TRIM:

SELECT phone, phone2
FROM jewishyellow.users
WHERE phone LIKE '813%'
    AND TRIM(IFNULL(phone2,'')) <> '';
micahwittman
fuente
No necesita usar la función de recorte, ya que en MySQL una cadena de cualquier número de espacios es igual a otra cadena de cualquier número de espacios, he escrito en respuesta sobre esto con bastante detalle stackoverflow.com/a/ 42723975/728236
Brian Leishman
7
select phone, phone2 from jewishyellow.users 
where phone like '813%' and phone2 is not null
Klaus Byskov Pedersen
fuente
66
Tenga en cuenta que hay una diferencia entre un NULLvalor y una cadena vacía ''que es un valor. Si desea verificar con una cadena vacía, use column <> ''según lo sugerido por las otras respuestas.
Dzhuneyt
7
SELECT phone, phone2 
FROM jewishyellow.users 
WHERE phone like '813%' and (phone2 <> "");

Puede necesitar algunos ajustes dependiendo de cuál sea su valor predeterminado. Si permitiste el relleno Nulo, entonces puedes hacer "No NULL", lo que obviamente es mejor.

Satanicpuppy
fuente
No lo marcaré, pero: 1) No hay NOT()función en MySQL 2) phone2=""no pasará ningún comprobador de sintaxis SQL.
OMG Ponies
1
Je, perdón Yo uso muchos servidores SQL diferentes.
Satanicpuppy
2

Podemos usar CASE para establecer el valor en blanco en algunos caracteres o cadenas. Estoy usando NA como cadena predeterminada.

SELECT phone,   
CASE WHEN phone2 = '' THEN 'NA' END AS phone2 ELSE ISNULL(phone2,0) 
FROM jewishyellow.users  WHERE phone LIKE '813%'
Atul
fuente
2

Otra alternativa es mirar específicamente CHAR_LENGTHlos valores de la columna. (no debe confundirse con LENGTH)

El uso de un criterio en el que la longitud del carácter es mayor que 0 evitará falsos positivos cuando los valores de la columna puedan ser falsos, como en el caso de una columna entera con un valor de 0o NULL. Comportarse de manera más consistente en diferentes tipos de datos.

Lo que da como resultado cualquier valor que tenga al menos 1 carácter de largo, o que de otra manera no esté vacío.

Ejemplo https://www.db-fiddle.com/f/iQvEhY1SH6wfruAvnmWdj5/1

SELECT phone, phone2
FROM users
WHERE phone LIKE '813%'
AND CHAR_LENGTH(phone2) > 0

Datos de tabla

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) > 0Resultados (iguales)

users
813-123-4567       | 1
813-123-4567       | 0

users2
813-123-4567       | 1
813-123-4567       | 0

Alternativas

phone2 <> ''Resultados (diferentes)

users
813-123-4567       | 1

users2
813-123-4567       | 1
813-123-4567       | 0

phone2 > ''Resultados (diferentes)

users
813-123-4567       | 1

users2
813-123-4567       | 1
813-123-4567       | 0

COALESCE(phone2, '') <> ''Resultados (iguales)
Nota: los resultados difieren de lo phone2 IS NOT NULL AND phone2 <> ''que no se espera

users
813-123-4567       | 1
813-123-4567       | 0

users2
813-123-4567       | 1
813-123-4567       | 0

phone2 IS NOT NULL AND phone2 <> ''Resultados (diferentes)

users
813-123-4567       | 1

users2
813-123-4567       | 1
813-123-4567       | 0
fyrye
fuente
2

Sorprendentemente (como nadie más lo mencionó antes) descubrió que la siguiente condición hace el trabajo:

WHERE ORD(field_to_check) > 0 

cuando necesitamos excluir valores nulos y vacíos. ¿Alguien está al tanto de las desventajas del enfoque?

Sergey Ch
fuente
He intentado durante horas corregir la sintaxis y esto simplemente resolvió todo, ¡gracias!
demo7up
1

Utilizar:

SELECT t.phone, 
       t.phone2 
  FROM jewishyellow.users t
 WHERE t.phone LIKE '813%' 
   AND t.phone2 IS NOT NULL
Ponis OMG
fuente
1
Noté que a veces IS NOT NULLno se aplica a cadenas de solo columnas con valores vacíos ( ''). No sé por qué, pero solo quería señalarlo. Es más sabio usarlo t.phone2 <> ''al buscar columnas de cadena vacías.
Dzhuneyt
0

puede usar el comodín como operador para lograr esto:

SELECT t.phone, 
       t.phone2 
FROM jewishyellow.users t
WHERE t.phone LIKE '813%' 
  AND t.phone2 like '[0-9]';

de esta manera, podría obtener todos los phone2 que tienen un prefijo de número.

Panda
fuente
0

En mi caso, tenía una columna varchar, los métodos de IS NOT NULL& != '' no funcionaron , pero lo siguiente funcionó para mí. Solo pongo esto aquí.

SELECT * FROM `db_name` WHERE `column_name` LIKE '%*%'
Mohd Abdul Mujib
fuente