it-swarm.asia

Oracle SQL - KASUS dalam klausa WHERE

Apakah mungkin melakukan ini?

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

Saya tahu bahwa klausa WHERE saya tidak benar.

Bantuan apa pun akan bagus untuk mengetahui apakah jenis pernyataan ini mungkin.

Saya tidak ingin menulis SQL Dinamis. Jika saya harus saya akan menulis 2 pernyataan SQL yang berbeda.

Terima kasih

6
Pranav Shah

Terima kasih telah memposting data sampel. Akan sangat membantu untuk menggambarkan dalam kata-kata dan dengan output aktual apa yang ingin Anda kembalikan oleh permintaan Anda.

Saya menduga Anda menginginkan sesuatu seperti

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.

Tapi saya membuat banyak tebakan tentang apa arti kode Anda.

Bahwa ini tampaknya identik dengan pertanyaan yang diajukan seseorang di forum OTN . Jawaban saya sama di kedua tempat.

14
Justin Cave

Coba tulis di mana klausa seperti ini:

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

Pertanyaan Justin Cave dan Eric Humphrey keduanya menghasilkan hasil yang berbeda. Berikut adalah jawaban ketiga yang sama validnya yang mengembalikan set hasil ketiga yang berbeda:

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

Hanya Anda yang akan tahu jawaban mana yang memberikan hasil yang Anda harapkan, tetapi mereka semua adalah jawaban yang benar untuk pertanyaan yang diberikan.

Pertanyaan Anda lebih baik daripada banyak orang karena pertanyaan itu lengkap dan termasuk sumber data, tetapi akan membantu jika Anda menyertakan output yang Anda cari juga. Saya sarankan Anda menambahkannya ke pertanyaan dan memastikan jawaban yang diterima cocok dengan hasil tersebut.

4
Leigh Riffel