¿Puedo utilizar la declaración CASE en una condición JOIN?

Resuelto Just a learner asked hace 12 años • 11 respuestas

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.partitionsy sys.allocation_unitsdepende 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 CASEdeclaració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 '=".

esta es la imagen

Just a learner avatar Apr 21 '12 13:04 Just a learner
Aceptado

Una CASEexpresión devuelve un valor de la THENparte 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 BOOLEANfuera un tipo de datos, entonces la prueba de igualdad tendría sentido).

HABO avatar Apr 21 '2012 15:04 HABO

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.

Niranjan Singh avatar Apr 21 '2012 06:04 Niranjan Singh

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)
richardtallent avatar Apr 21 '2012 06:04 richardtallent