CONCATTA i campi NULL
-
10-07-2019 - |
Domanda
Ho una tabella con tre campi, FirstName, LastName ed Email.
Ecco alcuni dati fittizi:
FirstName | LastName | Email
Adam West adam@west.com
Joe Schmoe NULL
Ora, se lo faccio:
SELECT CONCAT(FirstName, LastName, Email) as Vitals FROM MEMBERS
I valori vitali per Joe sono nulli, poiché esiste un singolo campo nullo. Come si supera questo comportamento? Inoltre, è questo il comportamento predefinito in MS SQL Server?
Soluzione
Prova
ISNULL(FirstName, '<BlankValue>') -- In SQL Server
IFNULL(Firstname, '<BlankValue>') -- In MySQL
Quindi,
CONCAT(ISNULL(FirstName,''),ISNULL(LastName,''),ISNULL(Email,'')) -- In SQL Server
CONCAT(IFNULL(FirstName,''),IFNULL(LastName,''),IFNULL(Email,'')) -- In MySQL
restituirebbe la stessa cosa senza il problema null (e una stringa vuota dove dovrebbero essere i null).
Altri suggerimenti
Guarda CONCAT_WS
Ad esempio:
CONCAT_WS('',NULL,"TEST STRING","TEST STRING 2")
I rendimenti
TEST STRINGTEST STRING 2
Questo è più facile che costruire IFNULL
attorno a tutto. Puoi usare una stringa vuota come separatore.
In mysql non funzionerà un po 'di tempo. prova IFNULL (),
CONCAT(IFNULL(FirstName,''),IFNULL(LastName,''),IFNULL(Email,''))
SELECT ISNULL(FirstName,'')+ISNULL(LastName,'')+ISNULL(Email,'') as Vitals FROM MEMBERS
è raccomandato, ma se sei davvero agganciato a CONCAT, avvolgilo in {fn} e puoi usare la funzione ODBC come:
SELECT {fn CONCAT(ISNULL(FirstName,''), ISNULL(LastName,''), ISNULL(Email,''))} as Vitals FROM MEMBERS
Se hai bisogno prima di < spazio > ultimo ma solo ultimo quando il primo è nullo puoi farlo:
ISNULL(FirstName+' ','') + ISNULL(LastName,'')
Ho aggiunto lo spazio sul nome che potrebbe essere nullo - ciò significherebbe che lo spazio sopravviverebbe solo se FirstName avesse un valore.
Per metterli tutti insieme con uno spazio tra ciascuno:
RTRIM(ISNULL(Firstname+' ','') + ISNULL(LastName+' ','') + ISNULL(Email,''))
Puoi sempre utilizzare l'impostazione CONCAT_NULL_YIELDS_NULL
..
basta eseguire SET CONCAT_NULL_YIELDS_NULL OFF
e quindi tutte le null
concatenazioni genereranno testo e non null ..
La risposta di Stefan è corretta. Per sondare un po 'più a fondo devi sapere che NULL non è lo stesso di Nothing. Null rappresenta l'assenza di un valore o, in altre parole, non definito. Niente rappresenta una stringa vuota che in realtà è un valore.
Non definito + niente = non definito
Buona conoscenza del database da trattenere!
Se ottieni (come faccio io in MySQL):
#1582 - Incorrect parameter count in the call to native function 'ISNULL'
È possibile sostituire la funzione ISNULL con COALESCE:
CONCAT(COALESCE(FirstName,''),COALESCE(LastName,''),COALESCE(Email,''))
A partire da MS SQL Server 2012 è stata introdotta la funzione CONCAT e secondo MSDN
I valori null vengono convertiti implicitamente in una stringa vuota. Se tutto il gli argomenti sono null, viene restituita una stringa vuota di tipo varchar (1).
quindi è sufficiente usare CONCAT senza IsNull
CONCAT(FirstName, LastName, Email)
SQL Server non ha una funzione CONCAT
.
(Aggiornamento: a partire da MS SQL Server 2012 è stata introdotta la funzione CONCAT )
Nel comportamento predefinito di SQL Server, i NULL si propagano attraverso un'espressione.
In SQL Server, si scriverebbe:
SELECT FirstName + LastName + Email as Vitals FROM MEMBERS
Se devi gestire NULL
s:
SELECT ISNULL(FirstName, '') + ISNULL(LastName, '') + ISNULL(Email, '') as Vitals FROM MEMBERS
Nel caso di MS Access
Opzione 1) SELEZIONA (Nome + " " + Cognome + " " + Email) come vitali DA MEMBRI Otterrai un risultato vuoto nel caso di qualsiasi campo con null.
Opzione 2) SELEZIONA (Nome & amp; " " & amp; LastName & amp; " " & amp; Email) come Vitals DA MEMBRI Otterrai Spazio al posto del campo con null.
Dopo aver osservato le risposte a questa domanda, puoi combinarle tutte in un'unica soluzione
CONCAT_WS(',',
IF(NULLIF(FirstName, '') IS NULL, NULL, FirstName),
IF(NULLIF(LastName, '') IS NULL, NULL, usr_lastname),
IF(NULLIF(Email, '') IS NULL, NULL, Email))
Quindi , in breve usiamo CONCAT_WS
per concatenare i nostri campi e separarli con ,
; e nota che NULL
campi né EMPTY
non saranno concatenati
NULLIF verificherà se il campo è NOT NULL
o <=>, un campo che contiene solo spazi o è anche vuoto, es: '', '') e l'output sarà <=> o <=>
SE inserirà il campo se non è <=> o <=>