質問
私はいくつかの特定の値が最初に表示されていることなど、いくつかのコラムで私のデータを整理する必要があります。したがって、このようなクエリのために...
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
を配置する方法はありますか?
解決
あなたは二回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
所属していません StackOverflow