Postgresql
如何過濾觸發器中值不為空的 hstore?
解釋問題的最簡單方法是使用審計觸發器。
但是,在插入時它會保存所有值,包括空值。我想過濾掉
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
,而不是json
或jsonb
。json
具有或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_cols
(WHERE
同時處理未嵌套的鍵):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
and
jsonb_strip_nulls()`(在評論中建議)如何進行比較。您可以通過性能比較報告嗎?