Postgresql

沒有元素時如何將 0 作為 array_length() 結果

  • December 29, 2015

我有一個這樣的查詢:

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可能是我想要的 - 但我對更好的想法持開放態度:

應該返回 0 而不是什麼都沒有(NULL),對吧?

應該返回什麼值得商榷。但是 Postgres 定義它的方式,任何不存在的維度的結果都是 NULL。

COALESCE是修復查詢的工具,但更好的解決方案是不要一開始就破壞它。

Postgres 9.4 中的替代方案

Postgres 9.4 或更高版本提供了一個單獨的函式**cardinality()**,每個文件:

返回數組中元素的總數,如果數組為空,則返回 0

大膽強調我的。

似乎您專門處理一維數組並且只想使用

test=# SELECT cardinality('{}'::int[]);
cardinality
-------------
          0

但是,這還不是解決您的問題的正確方法。整個數組可能是 NULL,無論哪種方式都返回 NULL,並且仍然排在最前面。

修復查詢NULLS LAST

SELECT id, array_length(users_who_like_ids, 1) AS ct
FROM   queryables
ORDER  BY 2 DESC **NULLS LAST**;

總是正確地處理 NULL 值。您可能仍希望cardinality()在 NULL 之前對空數組進行排序。但是在處理多維數組時要注意區別。

引用自:https://dba.stackexchange.com/questions/124741