我想查询我的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;
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[])
创建一个空的hstore。
ERROR: function akeys(character varying) does not exist
。 - Sandip Pingle