Como verifico se uma string de servidor SQL é nula ou vazia

225

Quero verificar dados, mas ignore-os se forem nulos ou vazios. Atualmente, a consulta é a seguinte ...

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      

Mas quero obter company.OfferText se listing.Offertextfor uma string vazia e também se for nula.

Qual é a melhor solução?

digiguru
fonte

Respostas:

433

Eu acho que isto:

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

é a solução mais elegante.

E para dividir um pouco em pseudo-código:

// 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;
Martin Ba
fonte
1
Não consegui decidir se voto sua resposta ou a do tiofofa, já que ele parece ter respondido primeiro, mas a resposta foi editada depois que você respondeu. Acabei votando em ambos.
Zecc 22/03/11
se list.Offer_Text = '', ele passa a condição NULLIF. Estou triste.
Merritt
Enquanto company.Offer_Text não é nulo, mas então isso vai complicar as coisas ... =)
Coops
3
Não devemos usar aparar para certificar-se tudo correr como planejado
irfandar
5
@irfandar - Bem, se você quiser tratar uma string com todos os espaços como vazios, use trim. Caso contrário, uma sequência com todos os espaços não estará vazia.
Martin Ba
53
SELECT
   CASE WHEN LEN(listing.OfferText) > 0 THEN listing.OfferText 
        ELSE COALESCE(Company.OfferText, '') END 
   AS Offer_Text,

... 

Neste exemplo, se listing.OfferTextfor NULL, a função LEN () também deve retornar NULL, mas ainda não é> 0.

Atualizar

Eu aprendi algumas coisas nos 5 anos e meio desde que postamos isso, e faço isso de maneira muito diferente agora:

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

Isso é semelhante à resposta aceita, mas também possui um fallback, caso Company.OfferTexttambém seja nulo. Nenhuma das outras respostas atuais usando NULLIF()também faz isso.

Joel Coehoorn
fonte
Isso foi votado hoje, então está indexado em algum lugar. Agora eu sei uma maneira melhor de fazer isso do que a resposta original.
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
Patrick Harrington
fonte
18

Aqui está outra solução:

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
Um machado
fonte
14

Você pode usar ISNULLe verificar a resposta na saída conhecida:

SELECT case when ISNULL(col1, '') = '' then '' else col1 END AS COL1 FROM TEST
Traineira de código
fonte
12

No SQL Server 2012 você tem IIF, por exemplo, você pode usá-lo como

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

Da mesma maneira que você pode verificar se o campo está vazio.

lkurylo
fonte
6

Use a função LEN para verificar valores nulos ou vazios. Você pode apenas usar LEN (@SomeVarcharParm)> 0. Isso retornará false se o valor for NULL, '' ou ''. Isso ocorre porque LEN (NULL) retorna NULL e NULL> 0 retorna false. Além disso, LEN ('') retorna 0. Veja você mesmo executar:

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
Zach Johnson
fonte
Quando você diz "... LEN (NULL) retorna NULL e NULL> 0 retorna false ...", a regra verdadeira é que todo teste ou comparação com NULL retorne NULL!
Didier68
É verdade que vale a pena notar, mas isso funciona como um atalho, porque a comparação faz o nulo se unir ao booleano correto, portanto, isso não funcionaria para a comparação inversa de LEN (NULL) = 0 quando queremos retornar verdadeiro para nulo ou vazio .
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
Muhammad Sharjeel Ahsan
fonte
Mais um na primeira resposta (5 anos depois) para usar os dois NULLIF()e unir-se a uma sequência vazia se company.OfferTextfor nulo. No entanto, a segunda NULLIF()chamada aqui não serve para nada, como se esse valor fosse uma string vazia, você só vai coalescer novamente em uma string vazia.
Joel Coehoorn
4

Essa simples combinação de COALESCE e NULLIF deve fazer o truque:

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

Nota: Adicione outra sequência vazia como o último argumento COALESCE se desejar que a instrução retorne uma sequência vazia em vez de NULL se os dois valores forem NULL.

contactmatt
fonte
4

Eu sei que este é um tópico antigo, mas eu acabei de ver um dos posts anteriores acima e não está correto.

Se você estiver usando LEN (...) para determinar se o campo é NULL ou VAZIO , será necessário usá-lo da seguinte maneira:

...WHEN LEN(ISNULL(MyField, '')) < 1 THEN NewValue...
Milão
fonte
3

Aqui está uma solução, mas não sei se é a melhor ....

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
digiguru
fonte
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
Anoop Verma
fonte
3

esta sintaxe:

SELECT *
FROM tbl_directorylisting listing
WHERE (civilite_etudiant IS NULL)

trabalhou para mim no Microsoft SQL Server 2008 (SP3)

Romain Durand
fonte
2

Para impedir os registros com EmptyouNull valor no resultado SQL

podemos simplesmente adicionar ..... WHERE Column_name != '' or 'null'

Rastreador de código
fonte
Este seria o primeiro porto de escala, mas se você está fazendo as coisas como concatenação de várias colunas em uma tabela, por exemplo, então isso poderia excluir a linha em vez de apenas exibir um espaço em branco para essa coluna
Coops
2
[Column_name] IS NULL OR LEN(RTRIM(LTRIM([Column_name]))) = 0
user3829854
fonte
0

[Column_name]> '' exclui nulos e cadeias vazias. Há um espaço entre as aspas simples.

Hicham
fonte
0

Isso serve para espaços também.

(len(rtrim(ltrim(isnull(MyField,'')))) !=0
ramit girdhar
fonte