2017-02-13 8 views
1

json_array_elementsを使用してjson配列を展開します。しかし、それは非常にうまく動作します。 Plsは以下を参照してください。postgresql、複数選択json_array_elements werid

json_array_elements( '[1,2]')をa、json_array_elements( '[2、3、4]')をbとして選択します。

a | b 
---+--- 
1 | 2 
2 | 3 
1 | 4 
2 | 2 
1 | 3 
2 | 4 

(6行)

選択json_array_elements( '[1、2]')として、json_array_elements( '[2、3]')bと;

a | b 
---+--- 
1 | 2 
2 | 3 

(2行)

イッツ配列の長さが等しいとき、何かがうまくいかないようです。 誰も私に言うことができます、なぜこれのようなものです。

+0

私のpostgresqlのバージョンは9.4.4です。私は9.6.2をインストールし、テストSQLを実行し、何も変更されていません。 –

+0

[単一の選択リストのSQL多重UNNEST](http://stackoverflow.com/q/23003601/1995738) – klin

答えて

0

PostgreSQLは両方とも同時に終わるまで、各リストを繰り返します。

つまり、結果リストの長さは入力リストの長さのleast common multipleです。

この動作は確かに奇妙である、とPostgreSQLのV10に変更されます:

select json_array_elements('[1, 2]') as a, json_array_elements('[2, 3, 4]') as b; 
a | b 
---+--- 
1 | 2 
2 | 3 
    | 4 
(3 rows) 

commit messageから:

ProjectSetにSRF評価を動かしながら古い 「少なくともを保持できるようになります複数のSRFが1つの ターゲットリストに存在する場合(つまり、すべてのSRFが同時に入力されるまで、行を返すことを継続する場合)、我々は代わりに、 n行まで すべてのSRFが使い果たされ、既に枯渇したSRFのためにNULLが返されます。我々は は、あまりにも混乱する、予期しない、実際には でないことが前の動作を特に有用であるとみなした。

+0

ああ、それはなぜ。どうもありがとう。 PostgreSQLがこの変更を加えると、PostgreSQL 10でそれを行いますか? –

+0

はい。私は答えにその詳細を追加しました。 –