2008-12-02 21 views
184

Quiero verificar los datos, pero ignórelos si son nulos o están vacíos. Actualmente la consulta es la siguiente ...¿Cómo puedo verificar si una cadena de servidor Sql es nula o está vacía?

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 llegar company.OfferText si listing.Offertext es una cadena vacía, así como si es nulo.

¿Cuál es la mejor solución?

Respuesta

333

Creo que esto:

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

es la solución más elegante.

Y para romper hacia abajo un poco en 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; 
+1

No he podido decidir si debo volver a votar su respuesta o la de unclefofa, ya que parece haber respondido primero, pero su respuesta ha sido editada después de su respuesta. Terminé votando ambos. – Zecc

+0

if listing.Offer_Text = '', pasa la condición NULLIF. Estoy triste. – Merritt

+0

Siempre que company.Offer_Text no sea nulo, entonces esto complicará las cosas ... =) – Coops

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

... 

En este ejemplo, si listing.OfferText es NULL, la función LEN() también debe devolver NULL, pero que todavía no es> 0.

actualización

he aprendido algunas cosas en los 5 1/2 años desde la publicación de esto, y hacerlo de manera muy diferente ahora:

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

Esto es similar al ans ans wer, pero también tiene una reserva en caso de que Company.OfferText también sea nulo. Ninguna de las otras respuestas actuales que usan NULLIF() también lo hacen.

+0

esto que upvoted hoy en día, por lo que está indexada en alguna parte. Ahora sé una mejor manera de hacer esto que la respuesta original. –

32
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 
11

Puede utilizar ISNULL y comprobar la respuesta frente a la salida conocido:

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

Aquí es 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 
16

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 
1

Para evitar que los registros con Empty o Null valor en el resultado de SQL

podemos simplemente añadir ..... WHERE Column_name != '' or 'null'

+0

Este sería el primer puerto de escala, pero si hace cosas como concatenar desde varias columnas en una tabla, por ejemplo, esto excluiría la fila en lugar de solo mostrar un espacio en blanco para esa columna – Coops

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

esta sintaxis:

SELECT * 
FROM tbl_directorylisting listing 
WHERE (civilite_etudiant IS NULL) 

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

3
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 
+0

más uno para la primera respuesta (5 años después) para usar ambos 'NULLIF()' y fusionarse a una cadena vacía si 'company.OfferText' es nulo. Sin embargo, la segunda llamada 'NULLIF()' aquí no sirve para nada, ya que si ese valor es una cadena vacía, de todos modos se unirá de nuevo a una cadena vacía. –

9

En SQL Server 2012 que tiene IIF, por ejemplo, puede usarlo como

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

De la misma manera se puede comprobar si el campo esta vacio.

4

Utilice 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 usted mismo Run:

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 
+0

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

+0

Vale que vale la pena señalar, pero esto funciona como un atajo porque la comparación hace que el nulo se fusione con el 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. –

3

Esta combinación simple de unirse y NULLIF debe hacer el truco:

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

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

0
[Column_name] IS NULL OR LEN(RTRIM(LTRIM([Column_name]))) = 0 
0

Sé que este es un hilo viejo, pero yo sólo vi una de la anterior post anterior y no es correcto. Si está utilizando LEN() para determinar si la presentada es nula o está vacía entonces usted necesita para usarlo como sigue:

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