我想在我的 PostgreSQL 表中查询所有具有空 hstore 的行。除了我之外,这对所有人来说都是显而易见的,因为我找不到任何关于如何做到这一点的文档,也找不到其他 StackOverflow 问题来回答这个问题。检查 NULL 没有帮助,因为我找回了所有行,即使是那些properties
没有键/值的行:
SELECT widgets.*
FROM "widgets"
WHERE properties IS NOT NULL
任何想法如何做到这一点?
我想在我的 PostgreSQL 表中查询所有具有空 hstore 的行。除了我之外,这对所有人来说都是显而易见的,因为我找不到任何关于如何做到这一点的文档,也找不到其他 StackOverflow 问题来回答这个问题。检查 NULL 没有帮助,因为我找回了所有行,即使是那些properties
没有键/值的行:
SELECT widgets.*
FROM "widgets"
WHERE properties IS NOT NULL
任何想法如何做到这一点?
一种选择是将列的所有键作为数组返回并检查该数组是否不为空:
SELECT *
FROM widgets
WHERE properties IS NOT NULL
AND array_length(akeys(properties),1) > 0;
根据PostgreSQL listerve 上的消息,一种更简单的方法是:
SELECT * FROM widgets WHERE properties = ''::HSTORE;
作为一般规则,我建议您不要有一个有时和其他时间可能为空NULL
的列,在您希望在那里存在语义差异的不同情况之外,例如对于以不同方式解释两者的应用程序。特别是对于BOOLEAN
列,我通常会选择防止这种额外的自由度。
我经常做一些类似的事情:
ALTER TABLE widgets ALTER COLUMN properties SET NOT NULL;
-- OR:
ALTER TABLE widgets ADD CONSTRAINT its_null_or_nothin CHECK ( properties <> ''::HSTORE );
根据您发现更容易记住的内容,您还可以通过hstore('{}'::TEXT[])
.