web-dev-qa-db-ja.com

要素がない場合にarray_length()の結果として0を取得する方法

次のようなクエリがあります。

_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);
_

enter image description here

何もない(NULL)ではなく0を返す必要がありますよね?

インラインのようなifステートメントを実行できますか?

編集する

SOに関するこの関連する回答によると、COALESCEが私が望んでいるものであるように見えますが、より良いアイデアを受け入れることができます。

7
timpone

何もない(NULL)ではなく0を返す必要がありますよね?

これが何を返すかについての議論はこれからです。しかし、Postgresが定義する方法では、存在しないディメンションの結果はNULLです。

COALESCE はクエリを修正するためのツールですが、より適切な解決策は、最初からクエリを壊さないことです。

Postgres 9.4の代替

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の前にソートすることもできます。ただし、多次元配列を処理する場合は違いに注意してください。

8