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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top