ORDER BYにDECODE

こんなの書けるとは知らなかった。

SELECT DECODE(FLAG, '1', NAME1, '2', NAME2, NULL)
  FROM TEST
 ORDER BY DECODE(FLAG, '1', NAME1, '2', NAME2, NULL)

取得する項目はNAME1かNAME2のどちらかで、それを決めるのはFLAGという項目。ソート順は表示されている項目でソートして欲しいという要望を叶えるために、こんなの書けるかなぁとやってみたらフツーにソートされた。

SELECT * FROM (
  SELECT DECODE(FLAG, '1', NAME1, '2', NAME2, NULL) ORDER_NAME
    FROM TEST
) ORDER BY ORDER_NAME

こうしてしまうのとどっちがコスト低いか計測してみても簡単なテストデータとSQLじゃ全く違いが出なかったので、本番データで検証してみる。アプリの作り上、変更が楽ちんなのは後者だったりする。取得された列でソートっていうのは今まで後者を採用してた。