操作の結果として変更されたすべてのフィールドを格納する監査テーブルにhstoreフィールドがあります。
挿入時のキー、updated_by
changed_fields
はNULLであり、システムアップデートではsystem
に設定されます。キーが定義されていないか、キーがsystem
ではないすべての行を返したいのですが、これを行う方法がわかりません。
これまで私は試しました
select changed_fields -> 'updated_by'
from audit.logged_actions
where (changed_fields -> 'updated_by' != 'system'
or defined(changed_fields, 'updated_by') = false)
order by event_id desc
しかし、それはうまくいかず、理由はよくわかりません。私が間違っていることについてのアイデアはありますか?
ドキュメントでのdefined()
の使用:
hstoreにはキーの非NULL値が含まれていますか?
既存のキーのNULL値に加えて、キーが存在しない場合もFALSE
を返します。
クリーンに保つには、代わりにexist()
関数を使用することをお勧めします。
SELECT exist('"bla" => 1234', 'bloo');
exist
───────
f
したがって、クエリは次のようになります
SELECT changed_fields -> 'updated_by'
FROM audit.logged_actions
WHERE changed_fields -> 'updated_by' <> 'system'
OR NOT exist(changed_fields, 'updated_by')
ORDER by event_id desc;
注:
IS
operator を使用できます。