1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

UNION した際、 CONVERT した項目で ORDER BY するには

Posted at

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しなおさねばならないのかよくわかっていないですが、 これは課題とします。

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?