次のようなクエリがあります。
_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);
_
何もない(NULL)ではなく0を返す必要がありますよね?
インラインのようなifステートメントを実行できますか?
SOに関するこの関連する回答によると、COALESCE
が私が望んでいるものであるように見えますが、より良いアイデアを受け入れることができます。
何もない(NULL)ではなく0を返す必要がありますよね?
これが何を返すかについての議論はこれからです。しかし、Postgresが定義する方法では、存在しないディメンションの結果はNULLです。
COALESCE
はクエリを修正するためのツールですが、より適切な解決策は、最初からクエリを壊さないことです。
Postgres 9.4以降では、個別の関数cardinality()
を提供しています ドキュメントごとに:
配列の要素の総数を返します。配列が空の場合は0を返します
大胆な強調鉱山。
1次元配列のみを扱い、thatを使用したいようです。
_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;
_
これはalwaysがNULL値を適切に処理します。 cardinality()
を使用して、空の配列をNULLの前にソートすることもできます。ただし、多次元配列を処理する場合は違いに注意してください。