Pular para o conteúdo
  • Este tópico contém 2 respostas, 2 vozes e foi atualizado pela última vez 2 anos, 10 meses atrás por Avatar photoJosé Laurindo Chiappa.
Visualizando 3 posts - 1 até 3 (de 3 do total)
  • Autor
    Posts
  • #153594
    rubens meirelles
    Participante

      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.VALORORIGINALANTERIOR

      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 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.

      #153595
      Avatar photoJosé Laurindo Chiappa
      Moderador

        Eu 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.VALORORIGINALANTERIOR

        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 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

        #153596
        Avatar photoJosé Laurindo Chiappa
        Moderador

          Outro 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’
          END

          nesse 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

        Visualizando 3 posts - 1 até 3 (de 3 do total)
        • Você deve fazer login para responder a este tópico.
        plugins premium WordPress