簡體   English   中英

tsvector更新中的PostgreSQL正則表達式

[英]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;

plpgsql賦值運算符是:= -與使用= SQL不同。

觸發:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM