when w3schools switch example else ejemplos sql sql-server join case

w3schools - select case when sql



¿Puedo usar la declaración CASE en una condición JOIN? (5)

En cambio, simplemente ÚNASE a ambas tablas, y en su cláusula SELECT, regrese los datos de la que coincida:

Le sugiero que vaya a través de este enlace Uniones condicionales en SQL Server y T-SQL Case Statement 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 mientras lo hace. Compruebe la consulta anterior que no tenga ningún error. He sacado la columna común y el valor de la columna derecha se evaluará con la condición.

La siguiente imagen es parte de las vistas del sistema de Microsoft SQL Server 2008 R2. De 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 es por la declaración CASE . ¿Alguien puede ayudar a explicar un poco?

¡Gracias!

Agregar mensaje de error:

Msg 102, nivel 15, estado 1, línea 6 Sintaxis incorrecta cerca de ''=''.


Aquí he comparado la diferencia en dos conjuntos de resultados diferentes. Espero que esto pueda ser útil.

SELECT main.ColumnName, compare.Value PreviousValue, main.Value CurrentValue FROM ( SELECT ''Name'' AS ColumnName, ''John'' as Value UNION ALL SELECT ''UserName'' AS ColumnName, ''jh001'' as Value UNION ALL SELECT ''Department'' AS ColumnName, ''HR'' as Value UNION ALL SELECT ''Phone'' AS ColumnName, NULL as Value UNION ALL SELECT ''DOB'' AS ColumnName, ''1993-01-01'' as Value UNION ALL SELECT ''CreateDate'' AS ColumnName, ''2017-01-01'' as Value UNION ALL SELECT ''IsActive'' AS ColumnName, ''1'' as Value ) main INNER JOIN ( SELECT ''Name'' AS ColumnName, ''Rahul'' as Value UNION ALL SELECT ''UserName'' AS ColumnName, ''rh001'' as Value UNION ALL SELECT ''Department'' AS ColumnName, ''HR'' as Value UNION ALL SELECT ''Phone'' AS ColumnName, ''01722112233'' as Value UNION ALL SELECT ''DOB'' AS ColumnName, ''1993-01-01'' as Value UNION ALL SELECT ''CreateDate'' AS ColumnName, ''2017-01-01'' as Value UNION ALL SELECT ''IsActive'' AS ColumnName, ''1'' as Value ) compare ON main.ColumnName = compare.ColumnName AND CASE WHEN main.Value IS NULL AND compare.Value IS NULL THEN 0 WHEN main.Value IS NULL AND compare.Value IS NOT NULL THEN 1 WHEN main.Value IS NOT NULL AND compare.Value IS NULL THEN 1 WHEN main.Value <> compare.Value THEN 1 END = 1



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)


Una expresión CASE devuelve un valor de la parte THEN 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 debe hacer algo con el valor devuelto, por ejemplo, compare con 1. Su afirmación intentó devolver el valor de una tarea o una prueba de igualdad, ninguna de las cuales tiene sentido en el contexto de una cláusula CASE / THEN . (Si BOOLEAN era un tipo de datos, entonces la prueba de igualdad tendría sentido).