2009-06-23 14 views
53

Tengo una tabla con tres campos, Nombre, Apellido y Correo electrónico.CONCATANDO campos NULL

He aquí algunos datos ficticios:

FirstName | LastName | Email 
Adam  West  [email protected] 
Joe   Schmoe  NULL 

Ahora, si lo hago:

SELECT CONCAT(FirstName, LastName, Email) as Vitals FROM MEMBERS 

vitales para Joe es nula, ya que no hay un único campo nulo. ¿Cómo superas este comportamiento? Además, ¿es este el comportamiento predeterminado en MS SQL Server?

Respuesta

111

Trate

ISNULL(FirstName, '<BlankValue>') -- In SQL Server 
IFNULL(Firstname, '<BlankValue>') -- In MySQL 

Así,

CONCAT(ISNULL(FirstName,''),ISNULL(LastName,''),ISNULL(Email,'')) -- In SQL Server 
CONCAT(IFNULL(FirstName,''),IFNULL(LastName,''),IFNULL(Email,'')) -- In MySQL 

volvería lo mismo sin la emisión nula (y una cadena en blanco, donde deben ser nulos).

+0

excelente, gracias! –

+9

ver [respuesta BILBO] (http://stackoverflow.com/a/5792720/532060) sobre [CONCAT_WS] (http://dev.mysql.com/doc/refman/5.0/en/string-functions.html# function_concat-ws), una mejor solución en mi opinión – dvb

+3

Esto no funciona con bases de datos MySQL ... CONCAT_WS() parece ser una solución más genérica. – ricosrealm

3

La respuesta de Stefan es correcta. Para sondear un poco más, necesita saber que NULL no es lo mismo que Nothing. Null representa la ausencia de un valor, o en otras palabras, no está definido. Nada representa una cadena vacía que ES de hecho un valor.

Indefinido + nada = indefinido

buen dato de base de datos a retener!

2

SQL Server no tiene una función CONCAT.
(Actualización: a partir de MS SQL Server 2012 it was introduced CONCAT function)

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 usted necesita para manejar NULL s:

SELECT ISNULL(FirstName, '') + ISNULL(LastName, '') + ISNULL(Email, '') as Vitals FROM MEMBERS 
5
SELECT ISNULL(FirstName,'')+ISNULL(LastName,'')+ISNULL(Email,'') as Vitals FROM MEMBERS 

es recomendable, pero si usted está realmente enganchado a CONCAT, envoltura 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 <espacio> por último, pero apenas el pasado, cuando primero es nula se puede hacer esto:

ISNULL(FirstName+' ','') + ISNULL(LastName,'') 

he añadido el espacio en primer nombre que podría ser nula - que significaría el espacio solamente sobreviviría si FirstName tenía un valor.

ponerlos todos juntos con un espacio entre cada uno:

RTRIM(ISNULL(Firstname+' ','') + ISNULL(LastName+' ','') + ISNULL(Email,'')) 
+0

¿No sería el espacio en FirstName que el valor no sea nulo? –

+1

No. NULL + cualquier cosa es NULL. – Hafthor

5

Siempre se puede utilizar el ajuste CONCAT_NULL_YIELDS_NULL ..

basta con ejecutar SET CONCAT_NULL_YIELDS_NULL OFF y luego todas las concatenaciones null resultarán en texto y no nula ..

12

en MySQL isnull no trabajará algún tiempo. tratar IFNULL(),

CONCAT(IFNULL(FirstName,''),IFNULL(LastName,''),IFNULL(Email,'')) 
67

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 la construcción de IFNULL alrededor de todo. Puede usar una cadena vacía como separador.

+5

[Documentación CONCAT_WS] (http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_concat-ws) – dvb

+0

usándolo en MySQL, no sé sobre el servidor MS SQL aunque – sldev

3

Si obtiene (como lo hago en MySQL):

#1582 - Incorrect parameter count in the call to native function 'ISNULL' 

Se puede reemplazar la función ISNULL por COALESCE:

CONCAT(COALESCE(FirstName,''),COALESCE(LastName,''),COALESCE(Email,'')) 
1

En el caso de MS Access

Opción 1) SELECT (FirstName + "" + LastName + "" + Email) como Vitals FROM MEMBERS Obtendrá un resultado en blanco en el caso de cualquier campo con nulo.

Opción 2) SELECT (Nombre & "" & & Apellido "" & correo electrónico) como vitales DE LOS MIEMBROS DE Usted recibirá espacio en lugar del campo con nula.

0

Después de observar las respuestas a esta pregunta, es posible combinar todos ellos en una sola 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)) 

Así, en pocas palabras que utilizamos para concatenar CONCAT_WS nuestros campos y separarlos con ,; y observe que NULL campos ni EMPTY costumbre concatenan

NULLIF comprobará si el campo es NULL o EMPTY, un campo que contiene sólo espacios o está vacía, así, por ejemplo: '', ' ') y la salida se ser NULL o NOT NULL

SI saldrá a poner el campo si no es NULL o EMPTY

1

a partir de MS SQL Server 2012 se introdujo CONCAT función y according to MSDN

valores nulos se convierten implícitamente en una cadena vacía. Si todos los argumentos son nulos, se devuelve una cadena vacía de tipo varchar (1).

por lo que es suficiente para usar sin CONCAT EsNulo

CONCAT(FirstName, LastName, Email)