eu tenho esse sql
SELECT
price_amount,
price_currency,
CASE
WHEN price_currency='USD' THEN price_amount * 3.9024
WHEN price_currency='EUR' THEN price_amount * 4.413
WHEN price_currency='ILS' THEN price_amount * 1
ELSE price_amount * 1
END AS final_price
FROM items
WHERE final_price BETWEEN 1 AND 100
mas eu recebo:
ERRO: a coluna "preço_final" não existe
LINE 1: ...ce_amount * 1 END AS final_price FROM items WHERE final_pric...
Ele está sendo selecionado usando um alias, então por que ele está tentando encontrá-lo na tabela?
A cláusula WHERE é avaliada antes dos aliases na
SELECT
cláusula.WHERE
é usado para localizar linhas da tabela base que são a entrada para todas as expressões no arquivoSELECT
. Somente depois de localizar as linhas, vocêCASE
pode ser avaliado com valores reais e ofinal_price
alias recebe seu valor.Existem várias maneiras de resolver isso:
WHERE
cláusula - assim será usada para localizar as linhasWHERE
para a consulta externa - conforme você seleciona em uma tabela derivada, o alias se torna uma coluna "real" dessa maneiraHAVING
cláusula em vez de WHERE -HAVING
(no MySQL) funciona depois que oSELECT
é calculado para fazer uma "segunda onda" de filtragem. No SQL padrão (e no Postgres),SELECT
é processado logicamente apósHAVING
, então isso não funcionará.CASE
expressão, dessa forma ela se torna parte de sua tabela base e você pode até indexá-laAviso: sua consulta precisará fazer uma varredura de tabela/índice completa, a menos que você possa adicionar algumas
WHERE
condições "mais simples" ou usar a coluna virtual indexada.