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
Esto parece agradable
https://bytes.com/topic/sql-server/answers/881862-joining-different-tables-based-condition
FROM YourMainTable
LEFT JOIN AirportCity DepCity ON @TravelType = ''A'' and DepFrom = DepCity.Code
LEFT JOIN AirportCity DepCity ON @TravelType = ''B'' and SomeOtherColumn = SomeOtherColumnFromSomeOtherTable
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).