web-dev-qa-db-ja.com

json []配列が空でないことを確認する最も速い方法は何ですか?

_json[]_列_the_array_が空でないことを確認したい。 normal配列の場合、次の点を確認できます。

_the_array != '{}'
_

ただし、以下に示すように、これは_json[]_では機能しません。

_select '{}'::json[] != '{}'
ERROR:  could not identify an equality operator for type json
_

代わりに次のチェックを使用できます。

_array_length(the_array, 1) != null // yes, array_length on an
                                      empty array returns null
_

私の恐れは、array_length()が配列全体を反復して項目数をカウントし、そのカウントを返すことです。私の場合、配列の実際のサイズは必要ありません。それが空かどうかを知るだけです。

それで、array_length()は配列全体を反復しますか?もしそうなら、json配列が空かどうかを確認するより良い方法はありますか?

3
Jarius Hebzo

これはJSON配列を返しません。

_SELECT '{}'::json[]
_

タイプ_json[]_は「JSON配列」ではなく、タイプJSONのSQL配列です。この種の構造は決して使用しないでください。それはほぼ間違いなく悪いデザインの赤い旗です。

確認したいのは、実際のJSON配列が空ではないことです。これは jsonb_array_length(jsonb) で実行できます。 JSONはJSON、またはバイナリjsonの場合はJSONBとして保存されます。

_SELECT jsonb_array_length( '[]'::jsonb );
_

空かどうかを確認するには

_SELECT jsonb_array_length( '[]'::jsonb ) = 0;
_

警告、これはそれらの要素を数えるだけですそれらはnullになる可能性があります

_SELECT jsonb_array_length( '[null]'::jsonb );
_

したがって、最初に配列で jsonb_strip_nulls() を呼び出すことができます。

4
Evan Carroll