سؤال

لا بد لي من فرز بياناتي عن طريق بعض العمود، بحيث تظهر بعض القيمة المحددة أولا. لذلك لاستعلام مثل هذا ...

  SELECT rtrim(taskid) into v_taskid FROM tasks
  where
    /* some where clausers */
  and rownum = 1

... لقد استندت ذلك case when, ، ولكن ما يزعجني هو ثلاثة مختارات متداخلة لدي الآن:

  SELECT rtrim(taskid) into v_taskid FROM tasks where taskid in (
    select taskid from (
        select taskid,
        case when taskuser like '%myuser%' 
       then 0
           else 100
        end as ordervalue
        FROM tasks
        where       
          /* some where clausers */
        order by ordervalue
        )
    )    
    and rownum = 1

الأداء من الحكمة أعتقد أنه لا ينبغي أن يكون مشكلة، ولكن يبدو نوعا من السباغيتي ... هل هناك أي طريقة لوضعها case-when داخل ال where بند؟

هل كانت مفيدة؟

المحلول

أنت تسليم tasks الجدول مرتين. ليست هناك حاجة لهذا وستجعل الاستعلام الخاص بك يعمل ببطء. يمكن دمج استفسارك في استعلام بسيط مثل:

SELECT rtrim(taskid) into v_taskid
FROM (
  SELECT taskid 
  FROM tasks 
  WHERE /* some where clauses */
  ORDER BY case when taskuser like '%myuser%' then 0 else 100 end
)
WHERE rownum = 1;

ثم إما فقط استرداد الصف الأول أو إضافة جزء Rownum في استعلام خارجي.

نصائح أخرى

المستعمل row_number() over (...)

select 
  taskid
from (
  select 
    taskid,
    row_number() over (
      order by 
        case when taskuser like '%myuser%' then  0 
                                           else 100 
      end
    ) r
  from
    tasks
  WHERE
    /* some where clausers */
)
where 
  r = 1;

إذا taskid هو المفتاح الأساسي ل tasks لا تحتاج إلى الانضمام الذاتي (الاختيار الخارجي):

SELECT rtrim(taskid)
  FROM (SELECT taskid
           FROM tasks
           /* where clause */
          ORDER BY CASE
                      WHEN taskuser LIKE '%myuser%' THEN
                       0
                      ELSE
                       100
                   END)
 WHERE ROWNUM = 1
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top