[英]Oracle SQL case when for ordering
我必须按某些列对数据进行排序,以便首先显示某些特定值。 所以对于这样的查询...
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.