2

特定の値が最初に表示されるように、データを列ごとに並べ替える必要があります。したがって、このようなクエリの場合...

  SELECT rtrim(taskid) into v_taskid FROM tasks
  where
    /* some where clausers */
  and rownum = 1

... に基づいていますcase whenが、気になるのは、現在持っている 3 つのネストされた選択です。

  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

4

3 に答える 3

3

tasksテーブルを 2 回クエリしています。これは不要であり、クエリの実行が遅くなります。クエリは、次のように単純なクエリに組み合わせることができます。

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 部分を外側のクエリに追加します。

于 2010-03-11T13:03:11.607 に答える
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;
于 2010-03-11T12:54:57.930 に答える
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
于 2010-03-11T12:58:28.527 に答える