Postgresql

如何過濾觸發器中值不為空的 hstore?

  • August 27, 2020

解釋問題的最簡單方法是使用審計觸發器

但是,在插入時它會保存所有值,包括空值。我想過濾掉hstore(NEW.*). 最簡單/最快的方法是什麼?

來源:https ://github.com/2ndQuadrant/audit-trigger/blob/master/audit.sql#L134

audit_row.row_data = hstore(NEW.*) - excluded_cols;

這顯然不起作用,但希望能解釋答案的樣子。

audit_row.row_data = hstore(hstore(NEW.*) FILTER (WHERE value IS NOT NULL)) - excluded_cols;

首選將回答不使用使用者創建的函式,例如僅使用 Postgres 函式/運算符。

這適用於 >= PostgreSQL 11。

我正在尋找一個解決方案hstore,而不是jsonjsonbjson具有或jsonb可以包括的替代方式,但是hstore是優選的。

僅使用 Postgres 的內置工具和附加模組hstore,不涉及jsonb(根據要求):

audit_row.row_data = hstore(
  ARRAY (
     SELECT ARRAY[key, value]
     FROM   each(hstore(NEW.*) - excluded_cols)
     WHERE  value IS NOT NULL
     )
  );

hstore()函式的重載變體之一採用二維數組。

或者,您可以消除子句中列出的鍵名excluded_colsWHERE同時處理未嵌套的鍵):

audit_row.row_data = hstore(
  ARRAY (
     SELECT ARRAY[key, value]
     FROM   each(hstore(NEW.*))
     WHERE  value IS NOT NULL
     AND    key <> ANY (excluded_cols)
     )
  );

可能會快一點,不確定。應該沒有太大區別吧。

也不確定 jsonb andjsonb_strip_nulls()`(在評論中建議)如何進行比較。您可以通過性能比較報告嗎?

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