なんじゃくにっき

プログラミングの話題中心。

Oracle SQL 結構どうでもいい話

SQL(Oracle 10g)のOrder by句で遊んでみた。


ex.1


SELECT EMPNO, ENAME
FROM EMP
ORDER BY 1

SQLでOrder By句に数値を指定すると列番号でソートできるが
(列名で指定したほうがパッと分かるしリファクタリングにも強いけど)、


ex.2


SELECT EMPNO, ENAME
FROM EMP
ORDER BY 1.99

浮動小数点を指定した場合でも整数に丸められる(端数切捨て)
(結果はex.1と同じ)


ex.3


SELECT EMPNO, ENAME
FROM EMP
ORDER BY 0.99

(1以下の数の場合はエラー。列番号0番はないよ って怒られる。)




しかし・・


ex.4


SELECT EMPNO, ENAME
FROM EMP
ORDER BY -1

マイナスの値を指定した場合はエラーにならないが、ソートもされない
(列番号ではなく、値として認識される。当然どの行も同じ値になるのでソートされない)


ex.5


SELECT EMPNO, ENAME
FROM EMP
ORDER BY -0.00

0ならエラーだけど-0.00ならエラーにならない。


ex.6


SELECT EMPNO, ENAME
FROM EMP
ORDER BY 1 * 1

式の結果が正の整数でも列番号ではソートされない。


ex.7


SELECT EMPNO, ENAME
FROM EMP
ORDER BY :Column_id

値をバインドした場合もソートされない。


ex.8


SELECT EMPNO, ENAME
FROM EMP
ORDER BY DECODE(:Column_id, 0, EMPNO, 1, ENAME)

バインドした値によってソートに使う列を変えたい場合はこうかな?
(プログラム側でOrder by句を生成したほうがよさそうだけど)