Supongamos que tengo tablas a (con la columna a1) yb (con las columnas b1 y b2) y realizo una unión externa izquierda
SELECT *
FROM a LEFT OUTER JOIN b
ON a.a1 = b.b1
Entonces b1 y b2 serán NULL donde un valor de a1 no tiene un valor coincidente de b1.
¿Puedo proporcionar un valor predeterminado para b2, en lugar de NULL? Nota que se unen no funcionará aquí, porque no quiero que el valor por defecto para anular los nulos potenciales en b2 donde no es un valor de a1 b1 juego.
Es decir, con a y b como
CREATE TABLE a (a1)
AS VALUES (1),
(2),
(3) ;
CREATE TABLE b (b1,b2)
AS VALUES (1, 10),
(3, null) ;
a1 b1 | b2
--- --------
1 1 | 10
2 3 | NULL
3
y un valor predeterminado para b2 de, digamos, 100, quiero obtener el resultado
a1 | b1 | b2
---------------
1 | 1 | 10
2 | NULL | 100
3 | 3 | NULL
En este caso simple, podría hacerlo "a mano" mirando si b1 es NULL en la salida. ¿Es esa la mejor opción en general, o hay una forma más estándar y ordenada?
postgresql
join
Tom Ellis
fuente
fuente
sql
(lo que significa "SQL, el lenguaje de consulta". Esa etiqueta no denota ningún producto o dialecto DBMS específico). La parte:[b2]=CASE WHEN ... END
es una expresión SQL no válida (estándar).La respuesta original a esta pregunta no se explicó, así que demos otra oportunidad.
Usando una
CASE
declaraciónUsando este método, aprovechamos que tenemos otro valor en una columna diferente que,
IS NOT NULL
en este caso,b.b1
si ese valor es nulo, sabemos que la unión falló.Esto funcionará totalmente y generará exactamente lo que desea.
Usando un sub-SELECT
No use este método, es una idea de acumulación. Sigue leyendo.
Si no tenemos
NOT NULL
columnas que podamos explotar de esa manera, necesitamos algo para crear una columna que pueda funcionar de esa manera para nosotros ...Usando una comparación de filas
Sin embargo, incluso más fácil que forzar un valor falso para el que podemos comparar, es comparar la fila. En PostgreSQL, la fila tiene un valor por el nombre de la tabla. Por ejemplo,
SELECT foo FROM foo
devuelve una fila de tipofoo
(que es un tipo de fila), de la tablafoo
. Aquí probamos para ver si esa FILA es nula. Esto funcionará siempre que cada columnaIS NOT NULL
. Y, si cada columnaIS NULL
de tu tabla, entonces solo estás trolleando.fuente
b1
utilizada en laCASE
solución no necesita ser no anulable. La construcción funciona en cualquier caso.Creo que COALESCE es muy útil en ese caso. Devolverá el primer valor no NULL de una lista:
fuente