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

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

ただいまの
回答率

90.52%

  • PostgreSQL

    1059questions

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

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 323

whimyama

score 1

 前提・実現したいこと

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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mts10806

    2018/04/27 13:41

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

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2018/04/27 13:52

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

    キャンセル

  • whimyama

    2018/04/27 16:44

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

    キャンセル

回答 3

checkベストアンサー

+4

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/27 14:30

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

    キャンセル

  • 2018/04/27 14:58 編集

    ebcdikからjis変換は行ったことがあります。
    ステップ数はそんなにありませんが、対比表を作り、bytea型で扱ってhexに変換して、、などそこそこ手間どりました。

    ソートに関して性能も要求されるなら、作成した関数でのfunctionインデックスも考慮された方が良いかと思います。

    キャンセル

  • 2018/04/27 16:17

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

    キャンセル

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/27 14:28

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

    キャンセル

0

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

SELECT ...
FROM ...
WHERE ...
ORDER BY TRANSLATE(項目名,
' ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',
' 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ')


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/28 00:30 編集

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

    キャンセル

  • 2018/05/02 10:52

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

    キャンセル

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    【SQL】EXISTSで共通点があるレコードに対してT/Fを割り振る

    初投稿になります。自分で考えながらやっておりますが、 とある雑誌で当サイトの事を知り、ものは試しと投稿してみました。 自分の作業用メモをそのまま記載するため、至らないところある

  • 解決済

    postgresのデータ取得時間を短縮したい

    タイトルの通りpostgresからデータを取得する時間を短縮したいです。 以前にも質問させていただいたのですが、前回とは少し内容が変わっております。 テーブルには2700万

  • 解決済

    sqlで割合計算して順番に表示させるには?

    カラム同士で割り算して割合を出して、割合順に表示させるにはどうしたらいいのでしょうか? 例:データ 名前 授業日数 出席数   A 100       80 B    1

  • 解決済

    postgreSQL

    abcテーブル aaa   bbb  ccc       ddd 1020  taki 20160212   0 1020  jaki 20160421   0 105

  • 受付中

    PostgreSQL データの存在しない出力結果を0で埋めたい。

    PostgreSQL データの存在しない出力結果を0で埋めたい。 テーブルに存在しない、SQLの出力結果を0で埋めたいと考えております。 以下の様なSQLを作成したのですが

  • 解決済

    sql select文での''の使用について

    postgresqlにて select '' as 宣言した名前,'' as 宣言した名前(2) form テーブル名 のような select部分でカラム名を宣言すると

  • 解決済

    where句にcase文

    あるテーブルから男女どちらか、または両方のデータを取得するようなSQLを作成したいのですがうまくいきません。お力を貸していただけたらと思います。 現在作っているSQLは以下の

  • 解決済

    postgres 日付が直近のレコードを取得

    レコード抽出の条件に今日日付(時分含む)より前の直近の日付のレコードを取得したいのですが、どのようにしたら抽出することができるでしょうか?

同じタグがついた質問を見る

  • PostgreSQL

    1059questions

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