検索結果を辞書順に取り出す、五十音順に取り出す
デフォルトのソートはバイナリ順に並び替えられる。これは他のソートに比べて高速に処理することが可能である。
しかし、大文字小文字や全角半角、濁点、半濁点を扱うときに問題が発生する。
各言語サポートソート (NLSSORT) 関数を使用することで、これらの問題を解決することが可能である。しかしコード変換に関する変換コストは発生する。
NLSSORT 関数と NLS_SORT パラメータ
関数名には NLSSORT とアンダースコア(アンダーバー)が入っていないが、パラメータの場合には NLS_SORT を設定するのでスペルミスに気をつける。
- NLS_SORT=JAPANESE_M_CI
大文字小文字を区別しない(Case Ignore)
(注意) 通常の半角カナと全角カナは同一に扱われるが、半濁点、濁点のある半角カタカナと全角カタカナは同一として扱われない(Oracle 10g R1 : おそらくであるが、これが正しい仕様ではない気がする)。
NLSSORT 関数の使用例
使用例 : Oracle 10g R1(IA:32bit Win) キャラクタセット JA16SJISTILDE

SET PAGESIZE 100
COLUMN KANA_TEXT FORMAT A10
COLUMN JPN_M FORMAT A30
COLUMN JPN_M_CI FORMAT A20
COLUMN GB FORMAT A10
--
SELECT
KANA_TEXT,
NLSSORT(KANA_TEXT, 'NLS_SORT=JAPANESE_M') JPN_M,
NLSSORT(KANA_TEXT, 'NLS_SORT=JAPANESE_M_CI') JPN_M_CI,
NLSSORT(KANA_TEXT, 'NLS_SORT=GENERIC_BASELETTER') GB
FROM KANA_TBL
ORDER BY NLSSORT(KANA_TEXT, 'NLS_SORT=JAPANESE_M');
-- 実行結果
KANA_TEXT JPN_M JPN_M_CI GB
---------- ------------------------------ -------------------- ----------
a 01F50000020002 01F5000002 6100
a 01F50000020003 01F5000002 828100
A 01F50000020006 01F5000002 4100
A 01F50000020007 01F5000002 826000
b 01FA0000020002 01FA000002 6200
b 01FA0000020003 01FA000002 828200
B 01FA0000020006 01FA000002 4200
B 01FA0000020007 01FA000002 826100
ば 3DDE000002BD0002 3DDE000002BD 82CE00
バ 3DDE000002BD0003 3DDE000002BD 836F00
バ 3DDE3DBB00000202000403 3DDE3DBB00000202 CADE00
び 3DDF000002BD0002 3DDF000002BD 82D100
ビ 3DDF000002BD0003 3DDF000002BD 837200
ビ 3DDF3DBB00000202000403 3DDF3DBB00000202 CBDE00
ぶ 3DE0000002BD0002 3DE0000002BD 82D400
ブ 3DE0000002BD0003 3DE0000002BD 837500
ブ 3DE03DBB00000202000403 3DE03DBB00000202 CCDE00
17行が選択されました。
テストデータの構築スクリプト
CREATE TABLE RIVUS.KANA_TBL
(
KANA_TEXT VARCHAR2(20)
);
INSERT INTO KANA_TBL VALUES('バ');
INSERT INTO KANA_TBL VALUES('ビ');
INSERT INTO KANA_TBL VALUES('ブ');
INSERT INTO KANA_TBL VALUES('バ');
INSERT INTO KANA_TBL VALUES('ビ');
INSERT INTO KANA_TBL VALUES('ブ');
INSERT INTO KANA_TBL VALUES('ば');
INSERT INTO KANA_TBL VALUES('び');
INSERT INTO KANA_TBL VALUES('ぶ');
INSERT INTO KANA_TBL VALUES('a');
INSERT INTO KANA_TBL VALUES('b');
INSERT INTO KANA_TBL VALUES('A');
INSERT INTO KANA_TBL VALUES('B');
INSERT INTO KANA_TBL VALUES('a');
INSERT INTO KANA_TBL VALUES('b');
INSERT INTO KANA_TBL VALUES('A');
INSERT INTO KANA_TBL VALUES('B');
COMMIT;
関連事項