【问题标题】:Oracle SQL case when for ordering订购时的 Oracle SQL 案例
【发布时间】:2011-01-26 08:47:02
【问题描述】:

我必须按某列整理我的数据,以便首先出现某个特定值。所以对于这样的查询......

  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 子句中?

【问题讨论】:

    标签: sql oracle case-when


    【解决方案1】:

    用户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;
    

    【讨论】:

    • 此处不需要分析查询,会影响性能。
    【解决方案2】:

    如果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
    

    【讨论】:

      【解决方案3】:

      您正在查询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 部分。

      【讨论】:

        猜你喜欢
        • 2018-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-15
        • 2019-02-18
        • 1970-01-01
        相关资源
        最近更新 更多