Postgresql

如何將 tsvector_update_trigger 與 jsonb 列一起使用?

  • March 8, 2021

我需要從 jsonb 值創建記憶體的 ts_vector 列。我嘗試創建一個觸發器

CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE
ON tags FOR EACH ROW EXECUTE PROCEDURE
 tsvector_update_trigger(
   tsv, 'pg_catalog.english', "translations#>>'{en,name}'"
 );

但結果我得到一個錯誤

ERROR:  column "translations#>>'{en,name}'" does not exist

你沒有。您將需要編寫自己的觸發函式。內置的僅適用於文本列,不適用於 jsonb 列,也不適用於列上的函式。

在較新的版本上,另一種方法是使用生成的列。

create table tags (
   translations jsonb, 
   tsv tsvector generated always as (to_tsvector('pg_catalog.english',translations#>>'{en,name}')) stored 
);

雙引號是列的指標,但 postgres 通過加倍來轉義單引號

CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE
ON tags FOR EACH ROW EXECUTE PROCEDURE
 tsvector_update_trigger(
   tsv, 'pg_catalog.english', 'translations#>>''{en,name}'''
 );

引用自:https://dba.stackexchange.com/questions/286660