我具有由一些列到我的数据梳理,以使得一些特定的值首先出现。因此,对于这样的查询...

  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-whenwhere条款?

有帮助吗?

解决方案

您正在查询的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归因
不隶属于 StackOverflow
scroll top