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?

¿Fue útil?

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 <=>

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top