質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

3回答

1389閲覧

汎用機側の並びとPostgreSQLでの並びが一致しない

whimyama

総合スコア9

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

1クリップ

投稿2018/04/27 04:38

編集2018/04/27 04:45

前提・実現したいこと

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]+$')

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/04/27 04:41

SQLもコードなので```で囲ってください。(わからなければ質問編集画面でコード部分を選択し<code>ボタンを押してください)正しく反映されているかどうかは質問編集画面のプレビューを見ながら編集していってください。
退会済みユーザー

退会済みユーザー

2018/04/27 04:52

DIFFとってみれば理由がわかるぞな、もし。
whimyama

2018/04/27 07:44

ありがとうございます。確認してみます。
guest

回答3

0

ベストアンサー

EBCDICコードでの順序に並べ替えたいなら、EBCDICに変換したもので並べ替えるしかないと思います。

EBCDICとの変換用関数は確か無かったと思いますので、自前で実装するしかないかな。

(2) JISコードからEBCDICコードへの変換
※EBCDICには亜種があるので注意

投稿2018/04/27 04:49

編集2018/04/27 04:58
sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

whimyama

2018/04/27 05:30

コード表までありがとうございます! 素人なので、自前の実装はヘビーですが、試してみます!
sazi

2018/04/27 05:59 編集

ebcdikからjis変換は行ったことがあります。 ステップ数はそんなにありませんが、対比表を作り、bytea型で扱ってhexに変換して、、などそこそこ手間どりました。 ソートに関して性能も要求されるなら、作成した関数でのfunctionインデックスも考慮された方が良いかと思います。
whimyama

2018/04/27 07:17

なるほど。手順は見えてきました。性能の件は調べていく中で突き当たりました。 助言いただきありがとうございます。
guest

0

サンプルデータでは項目Gのみに英数字があるようですので下記のように。
SELECT ...
FROM ...
ORDER BY ...
TRANSLATE(項目G,
'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ')

投稿2018/04/27 04:57

iruyas

総合スコア1067

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

whimyama

2018/04/27 05:28

回答ありがとうございます。試してみます!
guest

0

PostgreSQLのにて、EBCCDICへ変換して... に載っている

SQL

1SELECT ... 2FROM ... 3WHERE ... 4ORDER BY TRANSLATE(項目名, 5' ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', 6' 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ')

が使えるかもしれません。

投稿2018/04/27 10:41

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2018/04/27 15:31 編集

文字で書いてしまうと意味ないですよ。 postgres側で扱える側はいいとしても、ebcdic側はchr(123)とかにしないと。 だけどコードを列挙してtranslate()というのは簡単そうで良いかもしれないですね。
Orlofsky

2018/05/02 01:52

たしかに回答としては雑ですね。OracleではCONVERT関数でEBCDICが使えた記憶があります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問