繁体   English   中英

订购时的Oracle SQL案例

[英]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;

如果taskidtasks的主键,则不需要自连接(外部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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM