[pgsql-jp: 30638] Re: PL/pgSQLで"(09:00)AAA"から"AAA"のみを抜き出すには?

ISHIDA Akio iakio @ pjam.jpweb.net
2003年 7月 30日 (水) 13:44:18 JST


こんにちは。石田@苫小牧市です。

aiko_0303 @ infoseek.jp wrote:
(2003/07/29 19:08)

> お世話になっております。kishikawaです。
> 
> 現在、PL/pgSQL を使用してトリガを作成しています。
> 
> ・TBL1のINSERT or UPDATEがあったときに呼び出される。
> ・TBL1の'氏名(name)'列データ更新時に、TBL2の'備考(ref)'列に「(HH:MM)氏名データ(改行コード)」
>   の形式で書き込まれる。

可能であれば、「HH:MM」の部分と「氏名データ」の部分を別のフィールドに
格納するようにテーブル構造を変更したほうが簡単のように思います。
よく見たら、ref フィールドに改行区切で追記とかしているようなので、
別テーブルにしたほうが良いかもしれません。



で、正規表現で切り出すこともできなくはないようです。

=> select substring('(09:10)山田太郎' from '\\((.*)\\)'),
->        substring('(09:10)山田太郎' from '\\(.*\\)(.*)');
 substring | substring
-----------+-----------
 09:10     | 山田太郎
(1 row)

正規表現はもうちょっと厳密に書くべきかもしれません。
'(' にマッチする正規表現を '\\(' と書かなければいけないところに注意で
す。
これを plpgsql のに書くとさらにエスケープが必要なので、

>     -- TBL2に記入する内容を作成する 
>     -- 前データは入っているか?
>     IF sRefOld ISNULL OR sRefOld = '''' THEN
>       -- (HH:MM)氏名データ のみをUPDATE
>     ELSE
>       -- 前データ + (改行コード)+ (HH:MM)氏名データ をUPDATE
>       sRefNew := sRefOld || ''\n'' || sRefNew  ;
> 
> --@@@@@@@@@@@@
> --前データが(09:10)山田太郎 
> --新規データが(10:00)山田太郎の場合は追記書き込みしない!!
> --
> --	ここの比較方法で詰まっています…
> --@@@@@@@@@@@@

      IF substring(sRefOld from ''\\\\(.*\\\\)(.*)'') = NEW.name THEN

みたいな感じになると思います。

--
ISHIDA Akio<iakio @ pjam.jpweb.net>




pgsql-jp メーリングリストの案内