cuenta la situación siguiente:la eficiencia de la utilización CASO CUANDO ... no es nulo vs ISNULL/COALESCE
- Hay tres tipos de entidades, dicen
Foo
,Bar
yBaz
. - Cada
Foo
debe asociarse conBar
oBaz
, pero no ambos al mismo tiempo.
El escenario ya está implementado de la siguiente manera:
- Hay tres tablas:
Foo
,Bar
yBaz
. Foo
tiene dos campos de clave foránea:Bar_ID
yBaz_ID
.- Exactamente uno de esos campos de clave foránea debe ser
NULL
.
Ahora me gustaría construir una consulta que muestra la lista de Foo
s, incluyendo la descripción de la Bar
o Baz
cada Foo
se asocia a. En realidad, la descripción de un Bar
es una fórmula bastante complicada de los campos de la fila correspondiente en la tabla Bar
. Lo mismo se aplica al Baz
.
Mi consulta actual tiene el siguiente aspecto:
SELECT Foo.*,
CASE
WHEN Foo.Bar_ID IS NOT NULL THEN
-- a formula, say...
ISNULL(Bar.LotNumber + '-', '') + Bar.ItemNumber
WHEN Foo.Baz_ID IS NOT NULL THEN
-- another formula, say...
ISNULL(Baz.Color + ' ', '') + Baz.Type
END AS 'Ba?Description'
FROM Foo
LEFT JOIN Bar ON Bar.Bar_ID = Foo.Bar_ID
LEFT JOIN Baz ON Baz.Baz_ID = Foo.Baz_ID
es la consulta anterior es más, menos o igual de eficiente que ...
SELECT Foo.*,
ISNULL(-- or COALESCE
ISNULL(Bar.LotNumber + '-', '') + Bar.ItemNumber,
ISNULL(Baz.Color + ' ', '') + Baz.Type
) AS 'Ba?Description'
FROM Foo
LEFT JOIN Bar ON Bar.Bar_ID = Foo.Bar_ID
LEFT JOIN Baz ON Baz.Baz_ID = Foo.Baz_ID
...?
Casi no tengo datos para trabajar, pero sé que esto se usará en un entorno donde la cantidad de datos hace que la eficiencia sea relevante. – pyon
Es un buen punto. No consideré la cantidad de expresiones anidadas en el bloque ISNULL. –
+1 - También el procesamiento 'NULL' es bastante rápido en general, por lo que definitivamente se necesita un gran conjunto de datos para ser notorio – JNK