AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 1170
Accepted
Pranav Shah
Pranav Shah
Asked: 2011-02-11 15:42:46 +0800 CST2011-02-11 15:42:46 +0800 CST 2011-02-11 15:42:46 +0800 CST

Oracle SQL - CASE em uma cláusula WHERE

  • 772

É possível de alguma forma fazer isso?

WITH T1 AS
(
   SELECT 1 AS SEQ, 'NOTHING 1' AS SOME_TYPE FROM DUAL UNION ALL
   SELECT 2 AS SEQ, 'NOTHING 2' AS SOME_TYPE FROM DUAL UNION ALL
   SELECT 3 AS SEQ, 'SOMETHING 1' AS SOME_TYPE FROM DUAL UNION ALL
   SELECT 4 AS SEQ, 'SOMETHING 2' AS SOME_TYPE FROM DUAL UNION ALL
   SELECT 5 AS SEQ, 'SOMETHING 3' AS SOME_TYPE FROM DUAL UNION ALL
   select 6 as seq, 'SOMETHING 4' AS SOME_TYPE from dual
)
, T2 AS
(
   SELECT 'A' AS COMPARE_TYPE FROM DUAL UNION ALL
   SELECT 'B' AS COMPARE_TYPE FROM DUAL 
)
SELECT T2.*, T1.* 
FROM T1, T2
WHERE  CASE T2.COMPARE_TYPE 
         WHEN 'A'
            THEN T1.SOME_TYPE LIKE 'NOTHING%'
         ELSE T1.SOME_TYPE NOT LIKE 'NOTHING%' 
      END

Eu sei que minha cláusula WHERE is não está correta.

Qualquer ajuda seria ótima para saber se esse tipo de declaração é possível.

Eu não quero escrever um SQL dinâmico. Se for preciso, escreverei 2 instruções SQL diferentes.

Obrigado

oracle case
  • 3 3 respostas
  • 165461 Views

3 respostas

  • Voted
  1. Best Answer
    Justin Cave
    2011-02-11T16:00:54+08:002011-02-11T16:00:54+08:00

    Obrigado por postar os dados de exemplo. Também seria útil descrever em palavras e com saída real o que você deseja que seja retornado por sua consulta.

    Eu estou supondo que você quer algo como

    SQL> ed
    Wrote file afiedt.buf
    
      1  WITH T1 AS
      2  (
      3  SELECT 1 AS SEQ, 'NOTHING 1' AS SOME_TYPE FROM DUAL UNION ALL
      4  SELECT 2 AS SEQ, 'NOTHING 2' AS SOME_TYPE FROM DUAL UNION ALL
      5  SELECT 3 AS SEQ, 'SOMETHING 1' AS SOME_TYPE FROM DUAL UNION ALL
      6  SELECT 4 AS SEQ, 'SOMETHING 2' AS SOME_TYPE FROM DUAL UNION ALL
      7  SELECT 5 AS SEQ, 'SOMETHING 3' AS SOME_TYPE FROM DUAL UNION ALL
      8  select 6 as seq, 'SOMETHING 4' AS SOME_type from dual
      9  )
     10  , T2 AS
     11  (
     12  SELECT 'A' AS COMPARE_TYPE FROM DUAL UNION ALL
     13  SELECT 'B' AS COMPARE_type FROM DUAL
     14  )
     15  SELECT T2.*, T1.*
     16    FROM T1, T2
     17   WHERE (CASE WHEN T2.COMPARE_TYPE = 'A' AND
     18                    T1.SOME_TYPE LIKE 'NOTHING%'
     19                 THEN 1
     20               WHEN T2.COMPARE_TYPE != 'A' AND
     21                    T1.SOME_TYPE NOT LIKE 'NOTHING%'
     22                 THEN 1
     23               ELSE 0
     24*           END) = 1
    SQL> / 
    
    C        SEQ SOME_TYPE
    - ---------- -----------
    A          1 NOTHING 1
    A          2 NOTHING 2
    B          3 SOMETHING 1
    B          4 SOMETHING 2
    B          5 SOMETHING 3
    B          6 SOMETHING 4
    
    6 rows selected.
    

    Mas estou fazendo muitas suposições sobre o que seu código deve significar.

    Que isso parece ser idêntico a uma pergunta que alguém fez nos fóruns da OTN . Minha resposta é a mesma nos dois lugares.

    • 15
  2. Eric Humphrey - lotsahelp
    2011-02-11T16:04:51+08:002011-02-11T16:04:51+08:00

    Tente escrever a cláusula where desta maneira:

    WHERE (T2.COMPARE_TYPE = 'A' AND T1.SOME_TYPE LIKE 'NOTHING%')
       OR (T2.COMPARE_TYPE <> 'A' AND T1.SOME_TYPE NOT LIKE 'NOTHING%')
    
    • 6
  3. Leigh Riffel
    2011-02-12T08:06:45+08:002011-02-12T08:06:45+08:00

    As consultas de Justin Cave e Eric Humphrey retornam resultados diferentes. Aqui está uma terceira resposta igualmente válida que retorna um terceiro conjunto diferente de resultados:

    WHERE (T2.COMPARE_TYPE = 'A' AND T1.SOME_TYPE LIKE 'NOTHING%')
    OR T1.SOME_TYPE NOT LIKE 'NOTHING%' 
    

    Só você saberá qual resposta dá os resultados que você espera, mas todas são respostas corretas para a pergunta dada.

    Sua pergunta é melhor do que muitas porque é independente e inclui os dados de origem, mas ajudará se você incluir a saída que está procurando também. Eu recomendo que você adicione isso à pergunta e verifique se a resposta aceita corresponde a esses resultados.

    • 4

relate perguntas

  • Backups de banco de dados no Oracle - Exportar o banco de dados ou usar outras ferramentas?

  • ORDER BY usando prioridades personalizadas para colunas de texto

  • Interface sqlplus confortável? [fechado]

  • Como encontrar as instruções SQL mais recentes no banco de dados?

  • Como posso consultar nomes usando expressões regulares?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve