- Este tópico contém 2 respostas, 2 vozes e foi atualizado pela última vez 2 anos, 10 meses atrás por José Laurindo Chiappa.
-
AutorPosts
-
24 de fevereiro de 2022 às 10:47 am #153594rubens meirellesParticipante
Bom dia, sou novo no fórum e estou com uma dúvida pra montar uma subquery com o CASE.
Meu caso é o seguinte, preciso selecionar um tipo no sistema e de acordo com o tipo selecionado trazer os dados da tabela. Esses dados são salvos na mesma tabela, porém de acordo com o tipo, os campos são diferentes para cada um.
Então pensei em fazer o select para trazer todos os campos que eu preciso e de acordo com o tipo trazer os campos respectivo ao tipo selecionado de acordo com o CASE.
Montei a seguinte query:
SELECT D.TIPO,
D.QUANTIDADEANTERIOR,
D.PERIODOLOCACAOANTERIOR,
D.DATARESCISAO,
D.INICIOANTERIOR,
D.FIMANTERIOR,
D.QUANTIDADEANTERIOR,
D.PERIODOLOCACAOANTERIOR,
D.VALORUNITARIOANTERIOR,
D.VALORUNITARIO,
D.PERIODICIDADEANTERIOR,
D.VALORORIGINALANTERIORCASE WHEN D.TIPO = 1 THEN D.QUANTIDADEANTERIOR, D.PERIODOLOCACAOANTERIOR
WHEN 2 THEN D.DATARESCISAO
WHEN 3 THEN D.INICIOANTERIOR, D.FIMANTERIOR
WHEN 4 THEN D.QUANTIDADEANTERIOR, D.PERIODOLOCACAOANTERIOR
WHEN 5 THEN D.VALORUNITARIOANTERIOR, D.VALORUNITARIO
ELSE D.PERIODICIDADEANTERIOR, D.VALORORIGINALANTERIOREND AS TIPO_OBJETO
FROM CN_ADITIVOOBJETOS D
Porém recebo a seguinte mensagem:
Ocorreu o erro ORA-00923 palavra-chave FROM não localizada onde esperada na execução do comando SQL.
24 de fevereiro de 2022 às 2:41 pm #153595José Laurindo ChiappaModeradorEu vejo dois erros aí , um de sintaxe E outro de conceito : sintaxe é a questão que entre CADA COLUNA num SELECT vc TEM que ter uma vírgula de separação, e vc tem aí :
SELECT D.TIPO,
….
D.VALORORIGINALANTERIORCASE WHEN D.TIPO = 1 THEN D.QUANTIDADEANTERIOR, D.PERIODOLOCACAOANTERIOR
WHEN 2 THEN D.DATARESCISAO
WHEN 3 THEN D.INICIOANTERIOR, D.FIMANTERIOR
WHEN 4 THEN D.QUANTIDADEANTERIOR, D.PERIODOLOCACAOANTERIOR
WHEN 5 THEN D.VALORUNITARIOANTERIOR, D.VALORUNITARIO
ELSE D.PERIODICIDADEANTERIOR, D.VALORORIGINALANTERIOREND AS TIPO_OBJETO
FROM CN_ADITIVOOBJETOS D
==> tá vendo que FALTOU a vírgula entre a coluna D.VALORORIGINALANTERIOR e a coluna TIPO_OBJETO ???
Segunda, coisa, aí é Conceito : dentro de um CASE o THEN de cada WHEN vai retornar UM e apenas UM VALOR para cada WHEN que for verdadeiro, vide a documentação oficial em https://docs.oracle.com/en/database/oracle/oracle-database/19/lnpls/plsql-control-statements.html#GUID-18777904-23F6-4F6D-8B41-46BABF00BA03 que diz isso… Então, isso que vc escreveu :
WHEN 3 THEN D.INICIOANTERIOR, D.FIMANTERIOR
suponho que vc quer que quando for o valor 3 o THEN retorne DOIS VALORES , o .INICIOANTERIOR e o D.FIMANTERIOR ??? NÃO VAI ROLAR….
O que vc pode fazer aí seria CONCATENAR os dois valores numa stringona, ou retornar um TYPE/Array (que aí sim é um objeto único MAS pode ter multiplos valores contidos nele)…Abraços,
Chiappa
24 de fevereiro de 2022 às 4:00 pm #153596José Laurindo ChiappaModeradorOutro ponto : a função CASE tem duas sintaxes possíveis : na primeira delas, vc informa logo depois da palavra chave CASE a expressão/coluna que vc quer comparar , aí em cada WHEN vc só indica os valores a comparar, tipo :
CASE product_type_id
WHEN 1 THEN ‘Book’
WHEN 2 THEN ‘Video’
WHEN 3 THEN ‘DVD’
WHEN 4 THEN ‘CD’
ELSE ‘Magazine’
ENDnesse exemplo acima, SE product_type_id for igual a 1 o THEN retorna a string ‘Book’, SE product_type_id for igual a 2 o THEN retorna a string ‘Video’, assim por diante….
Essa sintaxe é ok, funciona, MAS com ela vc está limitado a fazer comparações de Igualdade entre a expressão/coluna informada depois do CASE com cada valor de comparação em cada WHEN… Há uma SEGUNDA SINTAXE , que é : vc Não Informa coluna/expressão depois do CASE, aí CADA WHEN pode ter as conparações mais diferentes que vc quiser, não só de igualdade, E com quaisquer colunas que quiser…
Para exemplificar a segunda sintaxe, neste meu exemplo, digamos que quando product_type_id for igual a 1 retorna ‘Book’, quando product_type_id estiver ENTRE 2 até 4 retorna ‘Digital Media’ e qquer outro retorna ‘Magazine’ : usando essa SEGUNDA sintaxe onde Não Estou restrito à Igualdade , eu poder escrever :CASE
WHEN product_type_id = 1 THEN ‘Book’
WHEN product_type_id BETWEEN 2 and 4 THEN ‘Digital Media’
ELSE ‘Magazine’
END==> compara isso com o que vc escreveu :
CASE
WHEN D.TIPO = 1 THEN D.QUANTIDADEANTERIOR, D.PERIODOLOCACAOANTERIOR
WHEN 2 THEN D.DATARESCISAO
WHEN 3 THEN D.INICIOANTERIOR, D.FIMANTERIOR
WHEN 4 THEN D.QUANTIDADEANTERIOR, D.PERIODOLOCACAOANTERIOR
WHEN 5 THEN D.VALORUNITARIOANTERIOR, D.VALORUNITARIO
ELSE D.PERIODICIDADEANTERIOR, D.VALORORIGINALANTERIOR
END==> Além de vc estar querendo retornar MAS DE UM VALOR em alguns THENs , vc MISTUROU as sintaxes : vc tem WHENs (os WHEN 2,3,4 e 5) onde só tem o valor de comparação, COMO É que o CASE vai saber com QUEM COMPARAR ??? Só pode dar enrosco….
Abraços,
Chiappa
-
AutorPosts
- Você deve fazer login para responder a este tópico.