使用从 Postgres 中其他列收集的值创建一个 JSONB 列
Create a JSONB column with values collected from other columns in Postgres
我有一个 Postgres table 喜欢
UserID EmailFlag PrintFlag SomeOtherField
12 1 0 yes
34 0 1 somecomment
为了优化 SQL 查询,我想像这样使用 JSONB 派生列:
UserID EmailFlag PrintFlag SomeOtherField JsonBDerivedColumn
12 1 0 yes {email: 1, print: 0 , comment: "yes"}
34 0 1 somecomment {email: 0, print: 1 , comment: "somecomment"}
如何使用 Postgres SQL 实现填充 JsonBDerivedColumn
?
您可以使用 jsonb_build_object
函数从其他字段构建 jsonb 对象:
jsonb_build_object('email', EmailFlag_field, 'print', PrintFlag_field, 'comment', SomeOtherField_field)
每次在 your_table
中插入或更新行时,您都可以通过触发器自动填充 JsonBDerivedColumn 列:
CREATE OR REPLACE FUNCTION T_Before_Insert_Update_your_table()
RETURNS trigger LANGUAGE plpgsql VOLATILE AS
$BODY$
BEGIN
NEW.JsonBDerivedColumn = jsonb_build_object('email', NEW.EmailFlag , 'print', NEW.PrintFlag, 'comment', NEW.SomeOtherField)
RETURN NEW ;
END ;
$BODY$
DROP TRIGGER IF EXISTS T_Before_Insert_Update_your_table ON your_table ;
CREATE TRIGGER T_Before_Insert_Update_your_table
BEFORE INSERT OR UPDATE OF EmailFlag, PrintFlag, SomeOtherField
ON your_table
FOR EACH ROW
EXECUTE PROCEDURE T_Before_Insert_Update_your_table() ;
如果在您添加新的 JsonBDerivedColumn 列并创建触发器函数之前,您的 table 已经存在行,您需要为 your_table
的所有现有行填充一次新列。您可以通过启动完整 table 的虚拟更新来实现,这将为 table 的所有现有行触发新的触发函数:
UPDATE your_table AS t
SET EmailFlag = t.EmailFlag
WHERE TRUE ;
但是在这个故事的最后,我不确定您是否已经优化了您的 SQL 查询...那么 simple index or multicolumn index or combining multiple indexes 基于现有列 EmailFlag、PrintFlag、SomeOtherField 呢?
我有一个 Postgres table 喜欢
UserID EmailFlag PrintFlag SomeOtherField
12 1 0 yes
34 0 1 somecomment
为了优化 SQL 查询,我想像这样使用 JSONB 派生列:
UserID EmailFlag PrintFlag SomeOtherField JsonBDerivedColumn
12 1 0 yes {email: 1, print: 0 , comment: "yes"}
34 0 1 somecomment {email: 0, print: 1 , comment: "somecomment"}
如何使用 Postgres SQL 实现填充 JsonBDerivedColumn
?
您可以使用 jsonb_build_object
函数从其他字段构建 jsonb 对象:
jsonb_build_object('email', EmailFlag_field, 'print', PrintFlag_field, 'comment', SomeOtherField_field)
每次在 your_table
中插入或更新行时,您都可以通过触发器自动填充 JsonBDerivedColumn 列:
CREATE OR REPLACE FUNCTION T_Before_Insert_Update_your_table()
RETURNS trigger LANGUAGE plpgsql VOLATILE AS
$BODY$
BEGIN
NEW.JsonBDerivedColumn = jsonb_build_object('email', NEW.EmailFlag , 'print', NEW.PrintFlag, 'comment', NEW.SomeOtherField)
RETURN NEW ;
END ;
$BODY$
DROP TRIGGER IF EXISTS T_Before_Insert_Update_your_table ON your_table ;
CREATE TRIGGER T_Before_Insert_Update_your_table
BEFORE INSERT OR UPDATE OF EmailFlag, PrintFlag, SomeOtherField
ON your_table
FOR EACH ROW
EXECUTE PROCEDURE T_Before_Insert_Update_your_table() ;
如果在您添加新的 JsonBDerivedColumn 列并创建触发器函数之前,您的 table 已经存在行,您需要为 your_table
的所有现有行填充一次新列。您可以通过启动完整 table 的虚拟更新来实现,这将为 table 的所有现有行触发新的触发函数:
UPDATE your_table AS t
SET EmailFlag = t.EmailFlag
WHERE TRUE ;
但是在这个故事的最后,我不确定您是否已经优化了您的 SQL 查询...那么 simple index or multicolumn index or combining multiple indexes 基于现有列 EmailFlag、PrintFlag、SomeOtherField 呢?