Postgres hstore 检查键是否存在且与值不匹配

Gau*_*rav 6 postgresql hstore

我在审计表中有一个 hstore 字段,用于存储因操作而更改的所有字段。

在插入时,键updated_byinchanged_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
Run Code Online (Sandbox Code Playgroud)

但这不起作用,我不太确定为什么。关于我做错了什么的任何想法?

dez*_*zso 11

defined()文档中的用法:

hstore 是否包含键的非 NULL 值?

除了现有键的 NULL 值外,它还FALSE在键不存在时返回。

为了保持干净,您可能需要使用该exist()函数:

SELECT exist('"bla" => 1234', 'bloo');
 exist 
???????
 f
Run Code Online (Sandbox Code Playgroud)

所以你的查询看起来像

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;
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 从来没有测试使用等于运算符(除非你可以是逻辑值真正确保值不能为NULL)。如果保证不是 NULL(如我的查询中),您可以直接使用该值,或者使用ISoperator
  • 在当前的形式中,查询正在检查一个简单的“或”——从你的措辞来看,当两个条件都为真时会发生什么还不是很清楚。