Alguém pode me ajudar a entender o que está acontecendo aqui?
SELECT
jsonb_array_length(to_jsonb("gi"."colors_distilled")) "gi_colors_distilled_jsonb_len"
FROM
"general_inventories" "gi"
WHERE
"gi_colors_distilled_jsonb_len" > 1;
Falha com:
-- ERROR: column "gi_colors_distilled_jsonb_len" does not exist
-- LINE 6: "gi_colors_distilled_jsonb_len" > 1;
Isso funciona (implementando a expressão diretamente na condição), no entanto:
SELECT
jsonb_array_length(to_jsonb("gi"."colors_distilled")) "gi_colors_distilled_jsonb_len"
FROM
"general_inventories" "gi"
WHERE
jsonb_array_length(to_jsonb("gi"."colors_distilled")) > 1;
Parece que devo estar perdendo algo óbvio, mas há tão pouco aí que devo estar errando em uma suposição sobre como/quando os aliases são avaliados.
A razão para isso é a
TRUE
ordem das operações em uma instrução SQL. É um pouco contra-intuitivo, mas depois de entender todo o Zeitgeist , ele se encaixará e você entenderá por que certas construções não funcionam, mesmo que um novato possa pensar que deveriam !Ordem de operações:
A partir daqui (boa explicação), é:
FROM/JOIN
WHERE
GROUP BY
HAVING
SELECT
ORDER BY
LIMIT/OFFSET
Então, vemos que o
WHERE
vem antes doSELECT
, mas é noSELECT
onde os aliases são definidos, mas aWHERE
cláusula não pode "ver" os aliases porque já foi avaliada.A
ORDER BY
cláusula, por outro lado, vem depois deSELECT
e, portanto, você pode usar aliases nessa cláusula!Sua própria pergunta é respondida no link.
Dê uma olhada aqui para outra visão - explica como o MySQL às vezes ignora isso e os problemas que isso pode causar (
STRICT_MODE
estar DESLIGADO - nunca execute o MySQL dessa maneira). Vale sempre a pena procurar o autor (Lukas Eder) (YouTube por exemplo).