web-dev-qa-db-ja.com

Postgres hstoreは、キーが存在し、値と一致しないかどうかを確認します

操作の結果として変更されたすべてのフィールドを格納する監査テーブルにhstoreフィールドがあります。

挿入時のキー、updated_bychanged_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

しかし、それはうまくいかず、理由はよくわかりません。私が間違っていることについてのアイデアはありますか?

5
Gaurav

ドキュメントでの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;

注:

  • 等価演算子を使用して論理値をテストしないでください(ただし、である場合を除き値をNULLにできないことを確認してください)。 (クエリのように)NULLでないことが保証されている場合は、値を直接使用するか、または IS operator を使用できます。
  • 現在の形式では、クエリは単純な「OR」をチェックしています-言い回しから、両方の条件が真の場合に何が起こるかは明確ではありません。
10
dezso