题
我具有由一些列到我的数据梳理,以使得一些特定的值首先出现。因此,对于这样的查询...
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):
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