[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 メーリングリストの案内