it-swarm.asia

Oracle SQL - حالة في عبارة WHERE

هل من الممكن القيام بذلك بطريقة أو بأخرى؟

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

أعلم أن عبارة WHERE is جملة غير صحيحة.

أي مساعدة ستكون رائعة في معرفة ما إذا كان هذا النوع من العبارات ممكنًا.

لا أريد كتابة SQL ديناميكي. إذا كان لا بد لي من كتابة عبارات SQL مختلفة.

شكر

6
Pranav Shah

شكرا لنشر عينة البيانات. سيكون من المفيد أيضًا أن تصف بالكلمات وبإخراج فعلي ما تريد إرجاعه بواسطة الاستعلام الخاص بك.

أظن أنك تريد شيء مثل

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.

لكني أقوم بالكثير من التخمينات حول ما يفترض أن تعني شفرتك.

يبدو أن هذا مطابق لسؤال طرحه شخص ما في منتديات OTN . جوابي هو نفسه في كلا المكانين.

14
Justin Cave

حاول كتابة جملة حيث بهذه الطريقة:

WHERE (T2.COMPARE_TYPE = 'A' AND T1.SOME_TYPE LIKE 'NOTHING%')
   OR (T2.COMPARE_TYPE <> 'A' AND T1.SOME_TYPE NOT LIKE 'NOTHING%')
6
Eric Humphrey - lotsahelp

كلا استعلامات جاستن كيف وإريك همفري ترجع نتائج مختلفة. فيما يلي إجابة ثالثة صالحة بنفس القدر والتي تعرض مجموعة مختلفة من النتائج:

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

ستعرف أنت فقط الإجابة التي تعطي النتائج التي تتوقعها ، لكنها كلها إجابات صحيحة على السؤال كما هو محدد.

سؤالك أفضل من كثير لأنه مضمون ذاتيًا ويتضمن بيانات المصدر ، ولكنه سيساعدك إذا قمت بتضمين الناتج الذي تبحث عنه أيضًا. أوصيك بإضافة ذلك إلى السؤال والتأكد من أن الإجابة المقبولة تطابق هذه النتائج.

4
Leigh Riffel