حالة Oracle SQL عندما للطلب
سؤال
لا بد لي من فرز بياناتي عن طريق بعض العمود، بحيث تظهر بعض القيمة المحددة أولا. لذلك لاستعلام مثل هذا ...
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
لا تنتمي إلى StackOverflow