UNIONするとCONVERTとした項目でORDER BYできない!
ORDER BY句内でCONVERT関数を用いた時に発生した事象の備忘録です。
先日、もともと存在していたSQLのソート方法を現在の文字コードではなく、別の文字コードによるソート方法にしたい、という問題が起こりました。
そこで、CONVERT関数を用いて、
SELECT
A項目
B項目
FROM
Xテーブル
ORDER BY
A項目
;
↓
SELECT
A項目
B項目
FROM
Xテーブル
ORDER BY
CONVERT(A項目,'JA16EUC')
;
とし、これでA項目を別の文字コード(ここではEUC)でソートした順番で表示してくれます。
しかし、ORDER BYをする対象が、UNION等で取得データの結合が行われたものであった場合は単に「CONVERT(A項目,'JA16EUC')」とするだけではうまくいきませんでした。
例えば、
SELECT
A項目
B項目
FROM
Xテーブル
UNION ALL
SELECT
A項目
B項目
FROM
Yテーブル
ORDER BY
CONVERT(A項目,'JA16EUC')
;
はうまくいきません。
「ORA-01785:ORDER BY 項目は、SELECTリスト式の数値である必要あります。」
が発生すると思います。
ちなみに、
SELECT
A項目
B項目
FROM
Xテーブル
UNION ALL
SELECT
A項目
B項目
FROM
Yテーブル
ORDER BY
A項目
;
では結合後の取得データをA項目でソートしたもの(ソートの際の文字コードはその環境デフォルトのものだが)がしっかりと表示されます。
取り急ぎ、該当処理を実行するためには、
SELECT
A項目
B項目
FROM(
SELECT
A項目
B項目
FROM
Xテーブル
UNION ALL
SELECT
A項目
B項目
FROM
Yテーブル
)
ORDER BY
CONVERT(A項目,'JA16EUC')
;
としてやれば達成できます。
なぜこのようにサブクエリを用いて取得したデータを、もう一回SELECTしなおさねばならないのかよくわかっていないですが、 これは課題とします。