【发布时间】:2012-12-06 11:27:02
【问题描述】:
我有一个 tsvector 列的以下更新触发器
CREATE TRIGGER tsvector_user_update
BEFORE INSERT OR UPDATE ON users
FOR EACH ROW EXECUTE PROCEDURE
tsvector_update_trigger(user_tsv, 'pg_catalog.english', firstname, surname, email, card_id);
这很好用,但是我的 card_id 列(文本)包含一个用户不知道的前导(它是在扫描卡后添加的),所以我想在生成tsvector值,我已经尝试过触发函数作为开始
CREATE FUNCTION user_change_trigger() RETURNS trigger AS $$
BEGIN
NEW.user_tsv = setweight(to_tsvector('pg_catalog.english', coalesce(NEW.firstname,'')), 'A') ||
setweight(to_tsvector('pg_catalog.english', coalesce(NEW.surname,'')), 'A') ||
setweight(to_tsvector('pg_catalog.english', coalesce(REGEXP_REPLACE(NEW.card_id, '^\d+PRE', ''),'')), 'B') ||
setweight(to_tsvector('pg_catalog.english', coalesce(NEW.email,'')), 'C');
return new;
END
$$ LANGUAGE plpgsql;
CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE
ON users FOR EACH ROW EXECUTE PROCEDURE user_change_trigger();
执行,但我得到以下信息:
WARNING: nonstandard use of escape in a string literal
而且没有更新的 tsvector
前导码是一个整数,后跟“PRE”。
(PostgreSQL 9.0)
【问题讨论】:
-
应该很明显,示例值是按顺序排列的。
regexp_replace()的结果是你有什么,你想要什么。而且“没有成功”似乎不是我所知道的 PostgreSQL 的错误消息 .. -
正则表达式并不是真正相关的,我真的很想知道是否可以在将列内容放入 tsvector_update_trigger 方法之前对其进行修改,正如您在下面所说的那样,这是不可能的,我需要写一个触发函数
标签: sql postgresql triggers postgresql-9.0 tsvector