Come posso verificare se una stringa del server SQL è nulla o vuota


225

Voglio verificare la presenza di dati, ma ignorarli se sono nulli o vuoti. Attualmente la query è la seguente ...

Select              
Coalesce(listing.OfferText, company.OfferText, '') As Offer_Text,         
from tbl_directorylisting listing  
 Inner Join tbl_companymaster company            
  On listing.company_id= company.company_id      

Ma voglio ottenere company.OfferText se listing.Offertextè una stringa vuota, così come se è nulla.

Qual è la soluzione più performante?

Risposte:


433

Io penso questo:

SELECT 
  ISNULL(NULLIF(listing.Offer_Text, ''), company.Offer_Text) AS Offer_Text
FROM ...

è la soluzione più elegante.

E per scomporlo un po 'nello pseudo codice:

// a) NULLIF:
if (listing.Offer_Text == '')
  temp := null;
else
  temp := listing.Offer_Text; // may now be null or non-null, but not ''
// b) ISNULL:
if (temp is null)
  result := true;
else
  result := false;

1
Non sono riuscito a decidere se dovrei votare la tua risposta o quella di unlefofa, dal momento che sembra aver prima risposto, ma la sua risposta è stata modificata dopo che hai risposto. Ho finito di votare entrambi.
Zecc,

se listing.Offer_Text = '', passa la condizione NULLIF. Sono triste.
Merritt

Fintanto che company.Offer_Text non è null ma questo complicherà le cose ... =)
Coops

3
Non dovremmo usare l'assetto per assicurarci che tutto vada come previsto
irfandar il

5
@irfandar - Beh, se vuoi trattare una stringa con tutti gli spazi vuoti, vai avanti usa trim. Altrimenti una stringa con tutti gli spazi non è vuota.
Martin Ba,

53
SELECT
   CASE WHEN LEN(listing.OfferText) > 0 THEN listing.OfferText 
        ELSE COALESCE(Company.OfferText, '') END 
   AS Offer_Text,

... 

In questo esempio, se listing.OfferTextè NULL, anche la funzione LEN () dovrebbe restituire NULL, ma non è ancora> 0.

Aggiornare

Ho imparato alcune cose in 5 anni e mezzo da quando ho pubblicato questo, e lo faccio in modo molto diverso ora:

COALESCE(NULLIF(listing.OfferText,''), Company.OfferText, '')

Questo è simile alla risposta accettata, ma ha anche un fallback nel caso in cui Company.OfferTextsia anche nullo. Nessuna delle altre risposte correnti che usano NULLIF()lo fa anche questo.


Questo è stato votato oggi, quindi è indicizzato da qualche parte. Ora conosco un modo migliore per farlo rispetto alla risposta originale.
Joel Coehoorn,

34
Select              
CASE
    WHEN listing.OfferText is null or listing.OfferText = '' THEN company.OfferText
    ELSE COALESCE(Company.OfferText, '')
END As Offer_Text,         
from tbl_directorylisting listing  
 Inner Join tbl_companymaster company            
  On listing.company_id= company.company_id

18

Ecco un'altra soluzione:

SELECT Isnull(Nullif(listing.offertext, ''), company.offertext) AS offer_text, 
FROM   tbl_directorylisting listing 
       INNER JOIN tbl_companymaster company 
         ON listing.company_id = company.company_id

14

È possibile utilizzare ISNULLe verificare la risposta rispetto all'output noto:

SELECT case when ISNULL(col1, '') = '' then '' else col1 END AS COL1 FROM TEST

12

In SQL Server 2012 hai IIF, ad esempio puoi usarlo come

SELECT IIF(field IS NULL, 1, 0) AS IsNull

Allo stesso modo è possibile verificare se il campo è vuoto.


6

Utilizzare la funzione LEN per verificare la presenza di valori nulli o vuoti. Puoi semplicemente usare LEN (@SomeVarcharParm)> 0. Questo restituirà false se il valore è NULL, '' o ''. Questo perché LEN (NULL) restituisce NULL e NULL> 0 restituisce false. Inoltre, LEN ('') restituisce 0. Guarda tu stesso esegui:

SELECT 
 CASE WHEN NULL > 0 THEN 'NULL > 0 = true' ELSE 'NULL > 0 = false' END,
 CASE WHEN LEN(NULL) > 0 THEN 'LEN(NULL) = true' ELSE 'LEN(NULL) = false' END,
 CASE WHEN LEN('') > 0 THEN 'LEN('''') > 0 = true' ELSE 'LEN('''') > 0 = false' END,
 CASE WHEN LEN(' ') > 0 THEN 'LEN('' '') > 0 = true' ELSE 'LEN('' '') > 0 = false' END,
 CASE WHEN LEN(' test ') > 0 THEN 'LEN('' test '') > 0 = true' ELSE 'LEN('' test '') > 0 = false' END

Quando dici "... LEN (NULL) restituisce NULL e NULL> 0 restituisce false ...", la vera regola è che ogni test o confronto con NULL restituisce NULL!
Didier68,

Giusto che vale la pena notare, ma questo funziona come una scorciatoia perché il confronto fa fondere il null con il booleano corretto, quindi non funzionerebbe per il confronto inverso di LEN (NULL) = 0 quando vogliamo restituire true per null o vuoto .
Zach Johnson,

4
Select              
Coalesce(NullIf(listing.OfferText, ''), NullIf(company.OfferText, ''), '') As Offer_Text,         
from tbl_directorylisting listing  
 Inner Join tbl_companymaster company            
  On listing.company_id= company.company_id

Più uno per la prima risposta (5 anni dopo) per utilizzare entrambi NULLIF()e unire una stringa vuota se company.OfferTextè nulla. Tuttavia, la seconda NULLIF()chiamata qui non serve a nulla, come se quel valore di una stringa vuota tornasse comunque a una stringa vuota.
Joel Coehoorn,

4

Questa semplice combinazione di COALESCE e NULLIF dovrebbe fare il trucco:

SELECT             
  Coalesce(NULLIF(listing.OfferText, ''), company.OfferText) As Offer_Text
...

Nota: aggiungere un'altra stringa vuota come ultimo argomento COALESCE se si desidera che l'istruzione restituisca una stringa vuota anziché NULL se entrambi i valori sono NULL.


4

So che questo è un vecchio thread, ma ho appena visto uno dei precedenti post sopra e non è corretto.

Se si utilizza LEN (...) per determinare se il campo è NULL o EMPTY, è necessario utilizzarlo come segue:

...WHEN LEN(ISNULL(MyField, '')) < 1 THEN NewValue...

3

Ecco una soluzione, ma non so se sia la migliore ...

Select              
Coalesce(Case When Len(listing.Offer_Text) = 0 Then Null Else listing.Offer_Text End, company.Offer_Text, '') As Offer_Text,         
from tbl_directorylisting listing  
 Inner Join tbl_companymaster company            
  On listing.company_id= company.company_id

3
SELECT              
    COALESCE(listing.OfferText, 'company.OfferText') AS Offer_Text,         
FROM 
    tbl_directorylisting listing  
    INNER JOIN tbl_companymaster company ON listing.company_id= company.company_id

3

questa sintassi:

SELECT *
FROM tbl_directorylisting listing
WHERE (civilite_etudiant IS NULL)

ha funzionato per me in Microsoft SQL Server 2008 (SP3)


2

Per impedire i record con Emptyo il Nullvalore nel risultato SQL

possiamo semplicemente aggiungere ..... WHERE Column_name != '' or 'null'


Questa sarebbe la prima porta di chiamata, ma se stai facendo cose come concatenare da più colonne in una tabella, ad esempio, questo escluderebbe la riga piuttosto che visualizzare solo uno spazio vuoto per quella colonna
Coops


0

[Nome_colonna]> '' esclude null e stringhe vuote. C'è uno spazio tra le virgolette singole.


0

Questo soddisfa anche gli spazi.

(len(rtrim(ltrim(isnull(MyField,'')))) !=0
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.