CASE WHEN NULL

21/07/2008 - 18:33 por MhBeyle | Informe spam
No logro entender muy bien por qué motivo esta consulta no funciona
bien cuando se da el caso de un registro con NULL:

SELECT
CASE T1.COD
WHEN NULL THEN T2.COD
WHEN 786 THEN '786-'
WHEN 777 THEN '777-'
ELSE T1.COD
END AS COD3, T1.COD AS COD1, T2.COD AS COD2
FROM
T1 FULL OUTER JOIN
T2 ON T1.COD = T2.COD

Cuando el CASE valida el número 786 (o cualquier otro) el resultado es
correcto, pero cuando el valor de la columna es NULL, siempre salta la
cláusula ELSE.

Especificar que lo que intento hacer es un FULL JOIN de dos tablas y
que, cuando la primera contenga un valor Nulo, tome el valor de la
segunda. A lo mejor lo que intento hacer es imposible o sólo es
posible escribiendo valores reales (no selecionados) en una tabla
temporal.

Un saludo,

MhBeyle __

Preguntas similare

Leer las respuestas

#1 MhBeyle
21/07/2008 - 18:52 | Informe spam
Ya me respondo a mí mismo:

SELECT ISNULL(T1.COD, T2.COD) AS COD
FROM
T1 FULL OUTER JOIN
T2 ON T1.COD = T2.COD


MhBeyle __

MhBeyle escribió lo siguiente ...

No logro entender muy bien por qué motivo esta consulta no funciona
bien cuando se da el caso de un registro con NULL:

SELECT
CASE T1.COD
WHEN NULL THEN T2.COD
WHEN 786 THEN '786-'
WHEN 777 THEN '777-'
ELSE T1.COD
END AS COD3, T1.COD AS COD1, T2.COD AS COD2
FROM
T1 FULL OUTER JOIN
T2 ON T1.COD = T2.COD

Cuando el CASE valida el número 786 (o cualquier otro) el resultado es
correcto, pero cuando el valor de la columna es NULL, siempre salta la
cláusula ELSE.

Especificar que lo que intento hacer es un FULL JOIN de dos tablas y
que, cuando la primera contenga un valor Nulo, tome el valor de la
segunda. A lo mejor lo que intento hacer es imposible o sólo es
posible escribiendo valores reales (no selecionados) en una tabla
temporal.

Un saludo,

MhBeyle __
Respuesta Responder a este mensaje
#2 Alejandro Mesa
21/07/2008 - 18:56 | Informe spam
Trata:

SELECT
CASE
WHEN T1.COD IS NULL THEN LTRIM(T2.COD)
WHEN T1.COD = 786 THEN '786-'
WHEN T1.COD = 777 THEN '777-'
ELSE LTRIM(T1.COD)
END AS COD3,
T1.COD AS COD1, T2.COD AS COD2
FROM
T1
FULL OUTER JOIN
T2
ON T1.COD = T2.COD
GO

El problema es que para comparar si una variable o columna contiene el valor
null, se debe usar @var / col IS [NOT] NULL.

Me llama la atencion que la comparacion sea contra valores enteros pero el
resultado devuelto por dos de los "WHEN" sea caracteres y que estos
caracteres no puedan ser convertidos implicitamente a entero. Nos puedes
decir el tipo de data de las columnas T1.COD y T2.COD?


AMB


"MhBeyle" wrote:

No logro entender muy bien por qué motivo esta consulta no funciona
bien cuando se da el caso de un registro con NULL:

SELECT
CASE T1.COD
WHEN NULL THEN T2.COD
WHEN 786 THEN '786-'
WHEN 777 THEN '777-'
ELSE T1.COD
END AS COD3, T1.COD AS COD1, T2.COD AS COD2
FROM
T1 FULL OUTER JOIN
T2 ON T1.COD = T2.COD

Cuando el CASE valida el número 786 (o cualquier otro) el resultado es
correcto, pero cuando el valor de la columna es NULL, siempre salta la
cláusula ELSE.

Especificar que lo que intento hacer es un FULL JOIN de dos tablas y
que, cuando la primera contenga un valor Nulo, tome el valor de la
segunda. A lo mejor lo que intento hacer es imposible o sólo es
posible escribiendo valores reales (no selecionados) en una tabla
temporal.

Un saludo,

MhBeyle __

Respuesta Responder a este mensaje
#3 MhBeyle
21/07/2008 - 19:26 | Informe spam
Como verás, lo he resuelto usando la función ISNULL, que sí que
funciona. No tenía ni idea de lo de que @var IS NULL sí funcionaba y
@var = NULL no. Creo recordar que en alguna ocasión he usado la misma
sentencia para hacer comparaciones de tablas con valores NULL y no me
había dado error, por eso creía que el problema era el uso de CASE en
un JOIN, pero igual me estoy equivocando
.
En cuanto a lo de los valores enteros, sólo era un ejemplo que escribí
para no tener que copiar toda la consulta entera, que es algo larga y,
obviamente, SQL Server daría error si igualara esa columna a un valor
Char :-) .

Un saludo y gracias,

MhBeyle ___

Alejandro Mesa escribió lo
siguiente ...

Trata:

SELECT
CASE
WHEN T1.COD IS NULL THEN LTRIM(T2.COD)
WHEN T1.COD = 786 THEN '786-'
WHEN T1.COD = 777 THEN '777-'
ELSE LTRIM(T1.COD)
END AS COD3,
T1.COD AS COD1, T2.COD AS COD2
FROM
T1
FULL OUTER JOIN
T2
ON T1.COD = T2.COD
GO

El problema es que para comparar si una variable o columna contiene el valor
null, se debe usar @var / col IS [NOT] NULL.

Me llama la atencion que la comparacion sea contra valores enteros pero el
resultado devuelto por dos de los "WHEN" sea caracteres y que estos
caracteres no puedan ser convertidos implicitamente a entero. Nos puedes
decir el tipo de data de las columnas T1.COD y T2.COD?


AMB


"MhBeyle" wrote:

No logro entender muy bien por qué motivo esta consulta no funciona
bien cuando se da el caso de un registro con NULL:

SELECT
CASE T1.COD
WHEN NULL THEN T2.COD
WHEN 786 THEN '786-'
WHEN 777 THEN '777-'
ELSE T1.COD
END AS COD3, T1.COD AS COD1, T2.COD AS COD2
FROM
T1 FULL OUTER JOIN
T2 ON T1.COD = T2.COD

Cuando el CASE valida el número 786 (o cualquier otro) el resultado es
correcto, pero cuando el valor de la columna es NULL, siempre salta la
cláusula ELSE.

Especificar que lo que intento hacer es un FULL JOIN de dos tablas y
que, cuando la primera contenga un valor Nulo, tome el valor de la
segunda. A lo mejor lo que intento hacer es imposible o sólo es
posible escribiendo valores reales (no selecionados) en una tabla
temporal.

Un saludo,

MhBeyle __

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida