• ベストアンサー

PL/pgSQLを使用して改行コードパージ

テーブルの任意フィールド(属性テキスト)にセットされている値の編集をPL/pgSQLを使用して 行いたいのです。PL/pgSQLは、組んだ事がないので解りません。 【例】 文章1\r\n文章2\r\n文章3\r\n\r\n\r\n・・・・・\r\n 文章3以降の改行コードを全てパージしたいのです。 【環境】 OS: CentOS5 DB: Version 8.3.3 現在ネットで検索しているのですが、対処方法を探せ出せていません。 ご教授願えれば幸いです。 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

要するに、3回目の改行以降をパージしたいと言うことでしょう。 select substring(txt from 1 for sec+thd) || --★5 replace(substring(txt from sec+thd+1),kai,'') --★4 from (select txt,sec, position(kai in substring(txt from sec+1)) as thd,kai --★3 from (select txt,position(kai in txt) as sec,kai --★2 from (select txt,chr(10) as kai from table) A) B) C --★1 fromを複数のサブクエリにしたのは分かり易くするためです。 ★1:txt(対象項目)とkai(改行文字)のみのクエリを起点とする ★2:txt中で改行位置を検索し、その位置をsecとする ★3:txtのsec+1以降にある改行位置を検索し、その位置をthdとする ★4:2回目の改行位置(sec+thd)+1以降の改行を空文字列に置換する ★5:2回目の改行位置(sec+thd)までの文字列と結合する 但し、改行が2個未満のデータがあった場合の動作は未確認です。

JACK_TOSHI
質問者

お礼

nda23さん、判り易い回答有難うございます。 テストは、問題なく動作致しました。 更新を、適用させて作業完了したいと思います。 本当にありがとうございます。

その他の回答 (2)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

意味が良く分かりません。 最初の質問では 文章1\r\n文章2\r\n文章3\r\n・・・ でした。補足では \r\n\r\n文章1・・・ のようになっています。どちらが正しいのですか? 後者なら有効部分の位置が明示的に5文字目以降なので、最初の 4文字と5文字目以降から改行を削除したものを結合すれば良い でしょう。前者ですと、不定長の文字列を挟んで3回目の改行 から削除するようになります。 どちらにしても生成可能ですが、内容が曖昧では作れません。

JACK_TOSHI
質問者

補足

nda23さん、ご説明が分かり難くて申し訳ありません。 どちらも、ありうるのです。 文章1\r\n文章2\r\n文章3\r\n\r\n・・・・・・と \r\n\r\n文章3\r\n\r\n・・・・・・・という具合です。そもそも このフィールドは、長い文章を登録していました。仕様変更により フィールドを2つテーブルに追加する方法を考案しましたが、このフィールドを改行で区切り3分割して各々別フィールドとして使う方法に切り替えました。作業工数短縮の為です。 この方法は、あとあと厄介になりますので、したくなかったのです。 なので文章3以降の改行コードだけをパージしたいのです。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

(1)replace(フィールド,chr(13) || chr(10),'') (2)replace(フィールド,chr(10),'') データ中に実際に\r\nが入っている場合は前者ですが、 普通、改行は\nのみなので、後者を使います。 (1)→(2)の順に試してみてください。 http://www.postgresql.jp/document/pg734doc/user/functions-string.html

JACK_TOSHI
質問者

補足

nda23さん、早々のご回答有難う御座います。 replace関数(1)ですと、全ての改行コードが置き換わってしまいますよね。 これですと都合が良くないのです。 前の2つの改行コードは、このまま残したいのです。 実際のデータは、改行コード改行コード文章改行コード・・・・・・ btrimで全ての改行コードをパージして、lpadで前に改行コードを2つ 補い編集してそのフィールドを上書き更新する方法しかないですかね? ご回答が、ヒントになりまして思いついたのですが?

関連するQ&A