我有一个这样的查询:
select id, array_length(users_who_like_ids,1) as ct
from queryables
order by 2 desc;
但是空数组(没有元素)排在最前面。对于这种情况,我宁愿array_length()
返回 0,以便将其排序到底部。
我可能不明白array_length()
(好吧,绝对)但是:
embers_dev2=# select array_length(array[1,2], 1), array_length(ARRAY[]::integer[],1);
应该返回 0 而不是什么都没有(NULL),对吧?
我可以在上面做一个像 inline 这样的 if 语句吗?
编辑
根据这个关于 SO 的相关答案,看起来COALESCE
可能是我想要的 - 但我对更好的想法持开放态度:
这应该返回什么值得商榷。但是 Postgres 定义它的方式,任何不存在的维度的结果都是 NULL。
COALESCE
是修复查询的工具,但更好的解决方案是不要一开始就破坏它。Postgres 9.4 中的替代方案
Postgres 9.4 或更高版本提供了一个单独的函数
cardinality()
,每个文档:大胆强调我的。
似乎您专门处理一维数组并且只想使用它。
但是,这还不是解决您的问题的正确方法。整个数组可能是 NULL,无论哪种方式都返回 NULL,并且仍然排在最前面。
修复查询
NULLS LAST
这总是正确地处理 NULL 值。您可能仍希望
cardinality()
在 NULL 之前对空数组进行排序。但是在处理多维数组时要注意区别。