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.
phone2
tiene algo en él"? La gente está tomando conjeturas en cuanto a si nos referimosphone2
no es nulo, no está en blanco, no es exclusivamente un espacio en blanco, etc.Respuestas:
Compare el valor de
phone2
con una cadena vacía:Tenga en cuenta que el
NULL
valor se interpreta comofalse
.fuente
phone2<>""
no pasará ningún comprobador de sintaxis SQL.Para verificar si el campo es NULL
IS NULL
, useIS NOT NULL
operadores.Referencia de MySql http://dev.mysql.com/doc/refman/5.0/en/working-with-null.html
fuente
Verifique
NULL
y vacíe los valores de cadena:Nota: creo que COALESCE () es el estándar SQL (-ish), mientras que ISNULL () no lo es.
fuente
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
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 sobreCOALESCE()
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:
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.
fuente
Si hay espacios en el campo phone2 desde la entrada de datos involuntaria, puede ignorar esos registros con las funciones IFNULL y TRIM:
fuente
fuente
NULL
valor y una cadena vacía''
que es un valor. Si desea verificar con una cadena vacía, usecolumn <> ''
según lo sugerido por las otras respuestas.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.
fuente
NOT()
función en MySQL 2)phone2=""
no pasará ningún comprobador de sintaxis SQL.Podemos usar CASE para establecer el valor en blanco en algunos caracteres o cadenas. Estoy usando NA como cadena predeterminada.
fuente
Otra alternativa es mirar específicamente
CHAR_LENGTH
los valores de la columna. (no debe confundirse conLENGTH
)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
0
oNULL
. 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
Datos de tabla
CHAR_LENGTH(phone2) > 0
Resultados (iguales)Alternativas
phone2 <> ''
Resultados (diferentes)phone2 > ''
Resultados (diferentes)COALESCE(phone2, '') <> ''
Resultados (iguales)Nota: los resultados difieren de lo
phone2 IS NOT NULL AND phone2 <> ''
que no se esperaphone2 IS NOT NULL AND phone2 <> ''
Resultados (diferentes)fuente
Sorprendentemente (como nadie más lo mencionó antes) descubrió que la siguiente condición hace el trabajo:
cuando necesitamos excluir valores nulos y vacíos. ¿Alguien está al tanto de las desventajas del enfoque?
fuente
Utilizar:
fuente
IS NOT NULL
no 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 usarlot.phone2 <> ''
al buscar columnas de cadena vacías.puede usar el comodín como operador para lograr esto:
de esta manera, podría obtener todos los phone2 que tienen un prefijo de número.
fuente
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í.fuente