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.


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.


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


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.


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.


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

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

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.


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

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

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?


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

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.


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 '%*%'
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.