¿Puedo utilizar la declaración CASE en una condición JOIN?
La siguiente imagen es parte de Vistas del sistema de Microsoft SQL Server 2008 R2. En la imagen podemos ver que la relación entre sys.partitions
y sys.allocation_units
depende del valor de sys.allocation_units.type
. Entonces, para unirlos, escribiría algo similar a esto:
SELECT *
FROM sys.indexes i
JOIN sys.partitions p
ON i.index_id = p.index_id
JOIN sys.allocation_units a
ON CASE
WHEN a.type IN (1, 3)
THEN a.container_id = p.hobt_id
WHEN a.type IN (2)
THEN a.container_id = p.partition_id
END
Pero el código superior da un error de sintaxis. Supongo que se debe a la CASE
declaración. ¿Alguien puede ayudar a explicar un poco?
Agregar mensaje de error:
Mensaje 102, nivel 15, estado 1, línea 6 Sintaxis incorrecta cerca de '=".
Una CASE
expresión devuelve un valor de la THEN
parte de la cláusula. Podrías usarlo así:
SELECT *
FROM sys.indexes i
JOIN sys.partitions p
ON i.index_id = p.index_id
JOIN sys.allocation_units a
ON CASE
WHEN a.type IN (1, 3) AND a.container_id = p.hobt_id THEN 1
WHEN a.type IN (2) AND a.container_id = p.partition_id THEN 1
ELSE 0
END = 1
Tenga en cuenta que necesita hacer algo con el valor devuelto, por ejemplo, compararlo con 1. Su declaración intentó devolver el valor de una asignación o prueba de igualdad, ninguna de las cuales tiene sentido en el contexto de una cláusula CASE
/ THEN
. (Si BOOLEAN
fuera un tipo de datos, entonces la prueba de igualdad tendría sentido).
En su lugar, simplemente UNIRSE a ambas tablas y, en su cláusula SELECT, devolver datos de la que coincida:
Le sugiero que consulte este enlace Uniones condicionales en SQL Server y Declaración de caso T-SQL en una cláusula JOIN ON
p.ej
SELECT *
FROM sys.indexes i
JOIN sys.partitions p
ON i.index_id = p.index_id
JOIN sys.allocation_units a
ON a.container_id =
CASE
WHEN a.type IN (1, 3)
THEN p.hobt_id
WHEN a.type IN (2)
THEN p.partition_id
END
Editar: según los comentarios.
No puede especificar la condición de unión como lo está haciendo. Verifique la consulta anterior que no tiene errores. Saqué la columna común y el valor de la columna derecha se evaluará según la condición.
Prueba esto:
...JOIN sys.allocation_units a ON
(a.type=2 AND a.container_id = p.partition_id)
OR (a.type IN (1, 3) AND a.container_id = p.hobt_id)