Suponha que eu tenha as tabelas a (com coluna a1) eb (com as colunas b1 e b2) e execute uma junção externa esquerda
SELECT *
FROM a LEFT OUTER JOIN b
ON a.a1 = b.b1
Em seguida, b1 e b2 serão NULL onde um valor de a1 não tem valor correspondente de b1.
Posso fornecer um valor padrão para b2, em vez de NULL? Note-se que COALESCE não vai funcionar aqui, porque eu não quero que o valor padrão para substituir potenciais nulos em b2 onde não é um valor de a1 correspondência b1.
Ou seja, com aeb 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
e um padrão para b2 de, digamos, 100, quero obter o resultado
a1 | b1 | b2
---------------
1 | 1 | 10
2 | NULL | 100
3 | 3 | NULL
Nesse caso simples, eu poderia fazê-lo "manualmente" examinando se b1 é NULL na saída. Essa é a melhor opção em geral, ou existe uma maneira mais padrão e organizada?
postgresql
join
Tom Ellis
fonte
fonte
sql
(o que significa "SQL the query language". Essa tag não indica nenhum produto ou dialeto específico do DBMS). A parte:[b2]=CASE WHEN ... END
é uma expressão SQL inválida (padrão).A resposta original a esta pergunta foi inexplicável, então vamos dar uma outra chance.
Usando uma
CASE
declaraçãoUsando esse método, exploramos que temos outro valor em uma coluna diferente que
IS NOT NULL
, nesse caso,b.b1
se esse valor for nulo, sabemos que a associação falhou.Isso funcionará totalmente e gerará exatamente o que você deseja.
Usando um sub-SELECT
Não use esse método, é uma ideia de construção. Continue lendo.
Se não temos
NOT NULL
colunas que possamos explorar dessa forma, precisamos de algo para criar uma coluna que possa funcionar dessa maneira para nós ...Usando uma comparação de linhas
Ainda mais fácil, ao forçar um valor falso com o qual podemos comparar, é comparar a linha. No PostgreSQL, a linha possui um valor pelo nome da tabela. Por exemplo,
SELECT foo FROM foo
retorna uma linha do tipofoo
(que é um tipo de linha), da tabelafoo
. Aqui testamos para ver se esse ROW é nulo. Isso funcionará desde que todas as colunasIS NOT NULL
. E, se todas as colunasIS NULL
da sua tabela, você está apenas trollando.fonte
b1
usada naCASE
solução não precisa ser não anulável. A construção funciona em ambos os casos.Acho que o COALESCE é muito útil nesse caso. Ele retornará o primeiro valor não NULL de uma lista:
fonte