Oracle SQL - CASE in una clausola WHERE

  • È possibile in qualche modo farlo?

    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
    

    So che la mia clausola WHERE is non è corretta.

    Qualsiasi aiuto sarebbe ottimo per sapere se questo tipo di affermazione è possibile.

    Non voglio scrivere un SQL dinamico. Se devo, scriverò 2 diverse istruzioni SQL.

    Grazie

  • Justin Cave

    Justin Cave Risposta corretta

    10 anni fa

    Grazie per aver pubblicato i dati di esempio. Sarebbe anche utile descrivere a parole e con l'output effettivo ciò che si desidera venga restituito dalla query.

    Immagino che tu voglia qualcosa di simile

    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.
    

    Ma sto facendo molte ipotesi su cosa dovrebbe significare il tuo codice.

    Che questo sembra essere identico a una domanda che qualcuno ha posto in Forum OTN. La mia risposta è la stessa in entrambi i casi.

    Grazie per la risposta. Funziona. Mi dispiace che la mia domanda non sia stata chiara.

    Grazie per la risposta!.

Licenza sotto CC-BY-SA con attribuzione


Contenuto datato prima del 26/06/2020 09:53