Postgresql
沒有元素時如何將 0 作為 array_length() 結果
我有一個這樣的查詢:
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 之前對空數組進行排序。但是在處理多維數組時要注意區別。