¿Cómo verifico si una cadena de servidor SQL es nula o está vacía?

225

Quiero verificar los datos, pero ignórelos si es nulo o está vacío. Actualmente la consulta es la siguiente ...

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      

Pero quiero obtener company.OfferText si listing.Offertextes una cadena vacía, así como si es nula.

¿Cuál es la mejor solución de rendimiento?

digiguru
fuente

Respuestas:

433

Pienso esto:

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

Es la solución más elegante.

Y para descomponerlo un poco en pseudocó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
fuente
1
No pude decidir si debería votar tu respuesta o la de unclefofa, ya que parece haber respondido primero, pero su respuesta fue editada después de que tú respondiste. Terminé votando a ambos.
Zecc
si listing.Offer_Text = '', pasa la condición NULLIF. Estoy triste
Merritt
Mientras company.Offer_Text no sea nulo, pero esto complicará las cosas ... =)
Coops
3
¿No deberíamos usar recortar para asegurarse de que todo va según lo planeado
irfandar
55
@irfandar - Bueno, si quieres tratar una cadena con todos los espacios como vacíos, usa trim. De lo contrario, una cadena con todos los espacios no está vacía.
Martin Ba
53
SELECT
   CASE WHEN LEN(listing.OfferText) > 0 THEN listing.OfferText 
        ELSE COALESCE(Company.OfferText, '') END 
   AS Offer_Text,

... 

En este ejemplo, si listing.OfferTextes NULL, la función LEN () también debería devolver NULL, pero aún así no es> 0.

Actualizar

He aprendido algunas cosas en los 5 años y medio desde que publiqué esto, y ahora lo hago de manera muy diferente:

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

Esto es similar a la respuesta aceptada, pero también tiene un respaldo en caso de Company.OfferTextque también sea nulo. Ninguna de las otras respuestas actuales usando NULLIF()también hace esto.

Joel Coehoorn
fuente
Esto se votó hoy, por lo que está indexado en alguna parte. Ahora sé una mejor manera de hacer esto que la respuesta 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
fuente
18

Aquí hay otra solución:

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
Un hacha
fuente
14

Puede usar ISNULLy verificar la respuesta con la salida conocida:

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

En SQL Server 2012 tienes IIF, por ejemplo, puedes usarlo como

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

De la misma manera puede verificar si el campo está vacío.

lkurylo
fuente
6

Use la función LEN para verificar valores nulos o vacíos. Puede usar LEN (@SomeVarcharParm)> 0. Esto devolverá falso si el valor es NULL, '' o ''. Esto se debe a que LEN (NULL) devuelve NULL y NULL> 0 devuelve false. Además, LEN ('') devuelve 0. Vea por usted mismo ejecutar:

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
fuente
Cuando dice "... LEN (NULL) devuelve NULL y NULL> 0 devuelve false ...", la regla verdadera es que cada prueba o comparación con NULL devuelve NULL.
Didier68
Vale la pena señalarlo, pero esto funciona como un atajo porque la comparación hace que el nulo se una al booleano correcto, por lo que esto no funcionaría para la comparación inversa de LEN (NULL) = 0 cuando queremos devolver verdadero para nulo o vacío .
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
fuente
Más uno para la primera respuesta (5 años después) para usar ambos NULLIF()y fusionarse en una cadena vacía si company.OfferTextes nulo. Sin embargo, la segunda NULLIF()llamada aquí no sirve para nada, ya que si ese valor es una cadena vacía, de todos modos solo se fusionará con una cadena vacía.
Joel Coehoorn
4

Esta combinación simple de COALESCE y NULLIF debería hacer el truco:

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

Nota: Agregue otra cadena vacía como último argumento COALESCE si desea que la instrucción devuelva una cadena vacía en lugar de NULL si ambos valores son NULL.

contactmatt
fuente
4

Sé que este es un hilo antiguo, pero acabo de ver una de las publicaciones anteriores y no es correcto.

Si está utilizando LEN (...) para determinar si el campo es NULO o VACÍO , debe usarlo de la siguiente manera:

...WHEN LEN(ISNULL(MyField, '')) < 1 THEN NewValue...
Milán
fuente
3

Aquí hay una solución, pero no sé si es la mejor ...

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
fuente
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
fuente
3

esta sintaxis:

SELECT *
FROM tbl_directorylisting listing
WHERE (civilite_etudiant IS NULL)

funcionó para mí en Microsoft SQL Server 2008 (SP3)

Romain Durand
fuente
2

Para evitar los registros con Emptyo Nullvalor en el resultado SQL

simplemente podemos agregar ..... WHERE Column_name != '' or 'null'

Code Crawler
fuente
Este sería el primer puerto de escala, pero si usted está haciendo las cosas como la concatenación de varias columnas en una tabla por ejemplo, entonces esto excluiría la fila en lugar de mostrar un espacio en blanco para que la columna
Las cooperativas
2
[Column_name] IS NULL OR LEN(RTRIM(LTRIM([Column_name]))) = 0
usuario3829854
fuente
0

[Column_name]> '' excluye Nulos y cadenas vacías. Hay un espacio entre las comillas simples.

Hicham
fuente
0

Esto también atiende espacios.

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