2011-02-17 10 views
6

Estoy buscando evitar expresiones que no sean dependientes de mis consultas, ¿cuál es la mejor manera de verificar una condición nula?Consultas relacionadas con ISNULL en TSQL

AND c.Account IS NOT NULL 
AND c.Account <> '' 

o

AND ISNULL(c.Account,'') <> '' 

me di cuenta de señalar que Account proviene de un LEFT JOIN por lo que puede ser nulo. Quiero los casos en que solo se cruzan, lo que significa que realmente debería usar un INNER JOIN ¿eh? Gracias por las facepalms;)

Sin embargo, pasando por alto esa autorealización nauseabunda, todavía quiero saber la respuesta a esto en el caso general en que no puedo hacer Account una columna NOT NULL.

+2

Es mejor establecer el campo Cuenta como NOT NULL, ya que estos valores significan lo mismo para usted y es mejor usar COALESCE, porque es parte del estándar SQL. – LukLed

+2

cadena vacía equivalente a NULL? Eeeeeek! –

+0

@lukled ~ Entonces, ¿sería mejor usar COALESCE? – jcolebrand

Respuesta

2

C.Account <> '' es equivalente a ISNULL(c.Account, '') <> ''

SQL Server es probablemente lo suficientemente inteligente como para traducir EsNulo en la expresión SARG equivalente pero si se empeñan en usar una función, entonces Coalesce es una mejor opción, ya que es parte del SQL Estándar, permite múltiples valores (en lugar de solo dos con IsNull) y evita utilizar posiblemente el nombre de función más confuso que Microsoft haya ideado en IsNull.

+1

¿Por qué crees que SQL-Server es lo suficientemente inteligente como para traducirlo a una expresión sargable? [Por lo que sé] (http://stackoverflow.com/questions/799584/what-makes-a-sql-statement-sargable) 'ISNULL' /' COALESCE' no son sargables y deberían reemplazarse por 'IS NULL O <> '' '. Además, 'COALESCE' todavía tiene un error grave en el servidor sql, por lo que' ISNULL' debe preferirse siempre que se necesite 'COLESCE'. Se traduce a un 'CASO' que evalúa dos veces. http://connect.microsoft.com/SQLServer/feedback/details/336002/unnecessarily-bad-performance-for-coalesce-subquery –

+1

@TimSchmelter - RE: IsNull, IMO, uno debe * nunca * usar IsNull. Hay cero excusa. Más allá del hecho de que es la función más horriblemente nombrada jamás concebida, no cumple con ANSI y la circunstancia que notó es de hace cinco años y solo se aplica cuando se utiliza una subconsulta (por lo que puede corregirse). Es mejor escribirlo como una declaración de caso que usar IsNull. Desearía que MS lo desaprobara por completo. En cuanto a si es sargable, dije que MS * podría * ser lo suficientemente inteligente como para hacerlo, ya que convierte la función en una expresión de caso, pero las probabilidades son que el analizador no puede manejar eso. – Thomas

+2

el estado de error todavía está activo. Todavía estoy en SQL-Server 2005 y al menos no hay soluciones. Esta consulta devuelve dos mensajes de error en lugar de uno (como con 'ISNULL'):' SELECT COALESCE (xyz, 0) FROM sys.objects'. La mayoría de las personas no lo saben, pero todos recomiendan usar 'COALESCE' en lugar de' ISNULL'. Incluso sin subconsultas, 'ISNULL' requiere un 20-30% menos de CPU para ejecutarse. –

-2

COALESCE ES SARGABLE porque es solo una expresión de acceso directo (equivalente al uso de CASE WHEN IS NOT NULL THEN ELSE ...).

ISNULL una construida en función de lo que NO se ISNULL sargable

2

Sólo tiene que utilizar WHERE c.Account <> ''

Esto no se evalúa como verdadera, ya sea para null o cadena vacía y, potencialmente, puede ser evaluada utilizando una gama buscan en Account .

El uso de ISNULL o COALESCE haría que la expresión no se pueda abrir y no se necesite de todos modos.

Si desea distinguir cadenas verdaderamente vacías de cadenas que consta en su totalidad de los espacios se puede utilizar

WHERE c.Account IS NOT NULL AND DATALENGTH(c.Account) > 0 

que combina un predicado sargable que permite una búsqueda de índice para saltar los nulos en un índice con uno unsargable contra los valores restantes