Es posible que queramos coger los valores de diferentes columnas para hacer una consulta. Por ejemplo, teniendo la siguiente tabla:
Product | ColumnA | ColumnB | ColumnC |
Alpha | 1 | 5 | 7 |
Bravo | 3 | 4 | 2 |
Siempre podemos hacerlo manualmente:
SELECT row, CASE WHEN ColumnC < ColumnA AND ColumnB < ColumnA THEN ColumnA
WHEN ColumnA < ColumnB AND ColumnC < ColumnB THEN ColumnB
WHEN ColumnA < ColumnC AND ColumnB < ColumnC THEN ColumnC
FROM table
Y esto nos daría lo siguiente
alpha, 7
bravo, 4
Pero claro, si tenemos catorce mil columnas o incluso el resultado proviene de un cálculo, tal vez no nos sea tan sencillo. Por ejemplo, pongamos que tenemos que multiplicar por 1.21 para sumar el IVA a los productos
SELECT row, CASE WHEN ColumnC < ColumnA AND ColumnB < ColumnA THEN ColumnA
WHEN ColumnA < ColumnB AND ColumnC < ColumnB THEN ColumnB
WHEN ColumnA < ColumnC AND ColumnB < ColumnC THEN ColumnC
FROM (SELECT ColumnA * 1.21 as ColumnA,
ColumnB * 1.21 as ColumnB,
ColumnC * 1.21 as ColumnC
FROM table) a
La opción B es utilizarlo de la siguiente forma
SELECT row, (SELECT max(res)
FROM (VALUES (t.ColumnA * 1.21),
(t.ColumnB * 1.21),
(t.ColumnC * 1.21)
) as MyValue(res))
FROM table t;
Y esto nos daría lo mismos resultados, haciendo una consulta mucho mas fácil de mantener. (Obviamente, lo primero sería optimizar el valor del IVA y que fuese una variable en vez de algo hardcoded, pero eso os lo dejo a vosotros)