如何在 PostgreSQL 中查询 hstore 为空的所有记录?

Rya*_*dge 3 postgresql

我想在我的 PostgreSQL 表中查询所有具有空 hstore 的行。除了我之外,这对所有人来说都必须是显而易见的,因为我找不到任何关于如何做到这一点的文档,也找不到回答该问题的其他 StackOverflow 问题。检查 NULL 没有帮助,因为我返回了所有行,即使是那些properties没有键/值的行:

SELECT widgets.* 
FROM "widgets" 
WHERE properties IS NOT NULL
Run Code Online (Sandbox Code Playgroud)

任何想法如何做到这一点?

koy*_*yae 6

根据PostgreSQL listerve 上的消息,执行此操作的更简单方法是:

SELECT * FROM widgets WHERE properties = ''::HSTORE;
Run Code Online (Sandbox Code Playgroud)

旁白:

作为一般规则,我建议您不要有一个有时为空NULL、有时为空的列,除了您希望存在语义差异的不同情况之外,例如,对于以不同方式解释两者的应用程序。特别是对于BOOLEAN列,我通常选择阻止这种额外的自由度。

我经常做类似的事情:

ALTER TABLE widgets ALTER COLUMN properties SET NOT NULL;
-- OR:
ALTER TABLE widgets ADD CONSTRAINT its_null_or_nothin CHECK ( properties <> ''::HSTORE );
Run Code Online (Sandbox Code Playgroud)

根据您发现更容易记住的内容,您还可以通过创建一个空的 hstore hstore('{}'::TEXT[])


a_h*_*ame 5

一种选择是将列的所有键作为数组返回并检查该数组是否为空:

SELECT *
FROM widgets
WHERE properties IS NOT NULL
  AND array_length(akeys(properties),1) > 0;
Run Code Online (Sandbox Code Playgroud)