[英]Postgresql regex in tsvector update
我對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)
問題是主要的。 在PostgreSQL中,您可以創建一個觸發函數來完成工作。 我沒有在問題中看到您的觸發功能。
然后,創建一個使用此功能的觸發器 。 您只能將常量傳遞給觸發函數。 考慮手冊中有關CREATE TRIGGER
引用
function_name
一個用戶提供的函數,該函數聲明為不帶任何參數並返回類型觸發器,該函數在觸發器觸發時執行。
論點
執行觸發器時,將提供給函數的可選的逗號分隔參數列表。 參數是文字字符串常量 。 簡單名稱和數字常量也可以在此處編寫,但是它們都將轉換為字符串。 請檢查對觸發器函數的實現語言的描述,以了解如何在函數中訪問這些參數。 它可能與普通函數參數不同。
大膽強調我的。
使用NEW
訪問觸發器函數中的列值。 您無需將它們作為參數傳遞。 首先掌握基本概念。 從這里開始。
regexp_replace()
采用:
regexp_replace(card_id, '^\d+PRE', '')
..因為前導字符應僅是數字(並且至少是其中之一)。
以下測試用例在PostgreSQL 9.1.6上對我有效 。 您的版本對我來說基本上不錯,我只做了很小的更改。 但是繼續閱讀...
創建測試環境(將在最后回滾):
BEGIN;
CREATE SCHEMA test;
SET search_path = test;
CREATE TABLE users (
users_id serial primary key
,firstname text
,surname text
,card_id text
,email text
,user_tsv tsvector
);
觸發功能:
CREATE FUNCTION user_change_trigger()
RETURNS trigger AS
$func$
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
$func$ LANGUAGE plpgsql;
觸發:
CREATE TRIGGER tsvectorupdate
BEFORE INSERT OR UPDATE ON users
FOR EACH ROW EXECUTE PROCEDURE user_change_trigger();
測試:
INSERT INTO users (firstname, surname, card_id, email)
VALUES ('Erwin', 'Brandstetter', '123PRE456', 'foo@dummy.org')
RETURNING *;
-- looks good!
UPDATE users SET firstname = 'Walter' WHERE TRUE
RETURNING *;
-- looks good, too!
清理:
ROLLBACK;
standard_conforming_strings
探索您的standard_conforming_strings
設置。 警告建議您不要啟用此設置,這需要將反斜杠加倍:
'^\\d+PRE'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.