没有元素时如何获得 0 作为 array_length() 结果

tim*_*one 8 postgresql null order-by array

我有一个这样的查询:

select id, array_length(users_who_like_ids,1) as ct
from queryables
order by 2 desc;
Run Code Online (Sandbox Code Playgroud)

但是空数组(没有元素)排在最前面。array_length()对于这种情况,我宁愿返回 0,以便将其排序到底部。

我可能不理解array_length()(好吧,绝对)但是:

embers_dev2=# select array_length(array[1,2], 1), array_length(ARRAY[]::integer[],1);
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

应该返回 0 而不是没有(NULL),对吗?

我可以在上面做一个像内联这样的 if 语句吗?

编辑

根据关于 SO 的这个相关答案,它看起来COALESCE可能是我想要的 - 但我愿意接受更好的想法:

Erw*_*ter 10

应该返回 0 而不是没有(NULL),对吗?

应该返回什么有待讨论。但是 Postgres 定义它的方式,任何不存在的维度的结果都是 NULL。

COALESCE 是修复查询的工具,但更好的解决方案是不要一开始就打破它。

Postgres 9.4 中的替代方案

Postgres 9.4 或更高版本提供了一个单独的功能cardinality()每个文档:

返回数组中元素的总数,如果数组为空则返回0

大胆强调我的。
似乎您只处理一维数组并且只想使用

test=# SELECT cardinality('{}'::int[]);
 cardinality
-------------
           0
Run Code Online (Sandbox Code Playgroud)

但是,这还不是解决您问题的正确方法。整个数组可能是 NULL,无论哪种方式都返回 NULL 并且仍然排在最前面。

修复查询 NULLS LAST

SELECT id, array_length(users_who_like_ids, 1) AS ct
FROM   queryables
ORDER  BY 2 DESC NULLS LAST;
Run Code Online (Sandbox Code Playgroud)

总是正确处理 NULL 值。您可能仍想使用cardinality()在 NULL 之前对空数组进行排序。但是在处理多维数组时要注意区别。