CONCAT ing campos NULL
-
10-07-2019 - |
Pregunta
Tengo una tabla con tres campos, Nombre, Apellidos y Correo electrónico.
He aquí algunos datos de prueba:
FirstName | LastName | Email
Adam West adam@west.com
Joe Schmoe NULL
Ahora, si yo hago:
SELECT CONCAT(FirstName, LastName, Email) as Vitals FROM MEMBERS
Vitales para Joe es nulo, ya que no hay un solo campo nulo.¿Cómo superar este comportamiento?También, este es el comportamiento por defecto en MS SQL Server?
Solución
Probar
ISNULL(FirstName, '<BlankValue>') -- In SQL Server
IFNULL(Firstname, '<BlankValue>') -- In MySQL
Entonces,
CONCAT(ISNULL(FirstName,''),ISNULL(LastName,''),ISNULL(Email,'')) -- In SQL Server
CONCAT(IFNULL(FirstName,''),IFNULL(LastName,''),IFNULL(Email,'')) -- In MySQL
devolvería lo mismo sin el problema nulo (y una cadena en blanco donde deberían estar los nulos).
Otros consejos
Mira CONCAT_WS
Por ejemplo:
CONCAT_WS('',NULL,"TEST STRING","TEST STRING 2")
Rendimientos
TEST STRINGTEST STRING 2
Esto es más fácil que construir IFNULL
alrededor de todo. Puede usar una cadena vacía como separador.
En mysql isnull no funcionará algún tiempo. pruebe IFNULL (),
CONCAT(IFNULL(FirstName,''),IFNULL(LastName,''),IFNULL(Email,''))
SELECT ISNULL(FirstName,'')+ISNULL(LastName,'')+ISNULL(Email,'') as Vitals FROM MEMBERS
Se recomienda , pero si realmente está enganchado a CONCAT, envuélvalo en {fn} y puede usar la función ODBC como:
SELECT {fn CONCAT(ISNULL(FirstName,''), ISNULL(LastName,''), ISNULL(Email,''))} as Vitals FROM MEMBERS
Si necesita primero < space > last pero solo last cuando first es nulo, puede hacer esto:
ISNULL(FirstName+' ','') + ISNULL(LastName,'')
Agregué el espacio en firstname que podría ser nulo, eso significaría que el espacio solo sobreviviría si FirstName tuviera un valor.
Para ponerlos todos juntos con un espacio entre cada uno:
RTRIM(ISNULL(Firstname+' ','') + ISNULL(LastName+' ','') + ISNULL(Email,''))
Siempre se puede utilizar la CONCAT_NULL_YIELDS_NULL
configuración..
sólo tiene que ejecutar SET CONCAT_NULL_YIELDS_NULL OFF
y, a continuación, todos los null
concatenaciones resultará en texto y no nulo..
La respuesta de Stefan es correcta. Para sondear un poco más, necesita saber que NULL no es lo mismo que Nothing. Nulo representa la ausencia de un valor, o en otras palabras, no definido. Nada representa una cadena vacía que ES de hecho un valor.
Indefinido + cualquier cosa = indefinido
Buen dato de base de datos para mantener!
Si obtienes (como lo hago en MySQL):
#1582 - Incorrect parameter count in the call to native function 'ISNULL'
Puede reemplazar la función ISNULL por COALESCE:
CONCAT(COALESCE(FirstName,''),COALESCE(LastName,''),COALESCE(Email,''))
A partir de MS SQL Server 2012 se introdujo la función CONCAT y según MSDN
Los valores nulos se convierten implícitamente en una cadena vacía. Si todo el los argumentos son nulos, se devuelve una cadena vacía de tipo varchar (1).
así que es suficiente usar CONCAT sin IsNull
CONCAT(FirstName, LastName, Email)
SQL Server no tiene una función CONCAT
.
(Actualización: a partir de MS SQL Server 2012 se introdujo la función CONCAT )
En el comportamiento predeterminado de SQL Server, los NULL se propagan a través de una expresión.
En SQL Server, uno escribiría:
SELECT FirstName + LastName + Email as Vitals FROM MEMBERS
Si necesita manejar NULL
s:
SELECT ISNULL(FirstName, '') + ISNULL(LastName, '') + ISNULL(Email, '') as Vitals FROM MEMBERS
En el caso de MS Access
Opción 1) SELECCIONAR (Nombre + " " + Apellido + " " + Correo electrónico) como Vitales DE LOS MIEMBROS Obtendrá un resultado en blanco en el caso de cualquier campo con nulo.
Opción 2) SELECCIONAR (Nombre & amp; " " & amp; Apellido & amp; " " & amp; Correo electrónico) como Vitales DE LOS MIEMBROS Obtendrá espacio en lugar de campo con nulo.
Después de observar las respuestas a esta pregunta, puede combinarlas todas en una solución simple
CONCAT_WS(',',
IF(NULLIF(FirstName, '') IS NULL, NULL, FirstName),
IF(NULLIF(LastName, '') IS NULL, NULL, usr_lastname),
IF(NULLIF(Email, '') IS NULL, NULL, Email))
Entonces , en resumen, usamos CONCAT_WS
para concatenar nuestros campos y separarlos con ,
; y observe que NULL
los campos ni EMPTY
no se concatenarán
NULLIF verificará si el campo es NOT NULL
o <=>, un campo que contiene solo espacios o también está vacío, por ejemplo: '', '') y la salida será ya sea <=> o <=>
IF eliminará el campo si no es <=> o <=>