前提・実現したいこと
Linux上のPostgreSQLにて、汎用機で出力したファイルと同じ結果を得ようとしています。
1 汎用機側:
受信ファイルを開いてKEY項目でSORTしてレコードを並び替える→ファイル整形して保存
2 Linux側:
受信ファイルを開いて、PostgreSQL上のDBにデータ保存→KEY項目でSORT(ORDER BY)して
結果をファイル出力して保存
発生している問題・エラーメッセージ
上記1と2で同じSORT指定でも生成されたファイルレコードの並び順が異なってしまします。
該当のソースコード
以下のDB対して、項目A~項目Gの順に昇順でSORTします。
項目A 項目B 項目C 項目D 項目E 項目F 項目G
126144859 20180427 20180428 20180427 999 99999 GR-101-1
126144859 20180427 20180428 20180427 999 99999 30013530
126311559 20180427 20180428 20180427 999 99999 DS-641
126311559 20180427 20180428 20180427 999 99999 GR-129
126311559 20180427 20180428 20180427 999 99999 GR-210
126311559 20180427 20180428 20180427 999 99999 10121-5
126411009 20180427 20180428 20180427 999 99999 Z-K-0000
126691015 20180427 20180428 20180427 999 99999 GR-100
127650215 20180427 20180428 20180427 999 99999 000001-A
127660211 20180427 20180428 20180427 999 99999 GR-110
127660211 20180427 20180428 20180427 999 99999 Z-K-0002
127660211 20180427 20180428 20180427 999 99999 000001-A
127729911 20180427 20180428 20180427 999 99999 DS-634-1
127729911 20180427 20180428 20180427 999 99999 DS-650
127729911 20180427 20180428 20180427 999 99999 DS-658
127729911 20180427 20180428 20180427 999 99999 GR-106
127729911 20180427 20180428 20180427 999 99999 GR-110
127729911 20180427 20180428 20180427 999 99999 GR-126
127729911 20180427 20180428 20180427 999 99999
127729911 20180427 20180428 20180427 999 99999 GR-129
127729911 20180427 20180428 20180427 999 99999 GR-500
127729911 20180427 20180428 20180427 999 99999 MSN-007
127729911 20180427 20180428 20180427 999 99999 TFS-160
127729911 20180427 20180428 20180427 999 99999 Z-K-0016
127729911 20180427 20180428 20180427 999 99999 Z-K-0027
127729911 20180427 20180428 20180427 999 99999 000001-003
127729911 20180427 20180428 20180427 999 99999 3001400002
127729911 20180427 20180428 20180427 999 99999 3001400003
試したこと
汎用機の結果とLinux側では、文字コードがEBCDICとASCIIで異なる事が原因という情報を得て
以下のように色々工夫しているのですが、完全には一致しません。
補足情報(FW/ツールのバージョンなど)
SELECT 項目A,項目B,項目C,項目D,項目E,項目F,項目G
FROM テーブル
ORDER BY 項目A,項目B,項目C,項目D,
(項目E IS NULL) DESC, SUBSTRING(項目E FROM '^[A-Z]+'), SUBSTRING(項目E FROM '[A-Z]'), SUBSTRING(項目E FROM '[0-9]'), SUBSTRING(項目E FROM '[0-9]+$'),
(項目F IS NULL) DESC, SUBSTRING(項目F FROM '^[A-Z]+'), SUBSTRING(項目F FROM '[A-Z]'), SUBSTRING(項目F FROM '[0-9]'), SUBSTRING(項目F FROM '[0-9]+$'),
(項目G IS NULL) DESC, SUBSTRING(項目G FROM '^[A-Z]+'), SUBSTRING(項目G FROM '[A-Z]'), SUBSTRING(項目G FROM '[0-9]'), SUBSTRING(項目G FROM '[0-9]+$')
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+4
EBCDICコードでの順序に並べ替えたいなら、EBCDICに変換したもので並べ替えるしかないと思います。
EBCDICとの変換用関数は確か無かったと思いますので、自前で実装するしかないかな。
(2) JISコードからEBCDICコードへの変換
※EBCDICには亜種があるので注意
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
サンプルデータでは項目Gのみに英数字があるようですので下記のように。
SELECT ...
FROM ...
ORDER BY ...
TRANSLATE(項目G,
'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ')
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
PostgreSQLのにて、EBCCDICへ変換して... に載っている
SELECT ...
FROM ...
WHERE ...
ORDER BY TRANSLATE(項目名,
' ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',
' 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ')
が使えるかもしれません。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 90.35%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
mts10806
2018/04/27 13:41
SQLもコードなので```で囲ってください。(わからなければ質問編集画面でコード部分を選択し<code>ボタンを押してください)正しく反映されているかどうかは質問編集画面のプレビューを見ながら編集していってください。
退会済みユーザー
2018/04/27 13:52
DIFFとってみれば理由がわかるぞな、もし。
whimyama
2018/04/27 16:44
ありがとうございます。確認してみます。