2017-01-05 13 views
0

私はjsonオブジェクトを含むカラムを持っています。私の目標は、私が限界を使っていても配列の総数を得ることです。Postgresがjsonカウントを取得する

CREATE TABLE json_values (
    elems json 
); 

INSERT INTO json_values VALUES ('{"field1" : [{"val" : 1}, {"val" : 2}, { "val" : 3}] ,"field2" : []}'); 


SELECT json_array_elements(elems->'field1'), count(*) OVER() 
FROM json_values 
LIMIT 1 

)これは最初の行を表示しますが、(オーバーカウントと思われるが考慮して取られていない、確かに私は唯一の1ではなく3

のを取得し、それを行うための別の方法はありますか?

答えて

1

あなたはこの仕事をするために参加横適切に使用する必要があります。

SELECT e.*, count(*) OVER() 
FROM json_values 
    cross join lateral json_array_elements(elems->'field1') as e(val) 
LIMIT 1; 

これは、集合を返す関数はselectリストで呼び出すべきでない理由の一つです。

おそらくより速く、より効率的であるかもしれないクロス結合を行う前に、可能な配列要素を制限し、やって正確にあなたが望む内容に応じて9.3

SELECT e.*, json_array_length(elems->'field1') 
FROM json_values 
    cross join lateral json_array_elements(elems->'field1') as e (val) 
LIMIT 1; 

のPostgresで導入されたjson_array_length()を使用することですされて別のオプション:

select e.*, json_array_length(elems->'field1') 
from json_values 
    cross join lateral (
    select * 
    from json_array_elements(elems->'field1') 
    limit 1 
) as e (val) 

しかし、あなたは唯一の各ドキュメントの配列の最初の要素を取得したい場合は、以下がはるかに高速になります:

SELECT (elems->'field1') -> 0, json_array_length(elems->'field1') 
FROM json_values; 
+0

素晴らしい回答ですが、実際にはjson_array_lengthはバージョン9.3以降で利用可能です –

1

場所json_array_elements()FROMでの句:

select count(*) over() 
from json_values, 
lateral json_array_elements(elems->'field1') 
limit 1; 

count 
------- 
    3 
(1 row) 
1

機能は、JSON配列の長さを返すことであります:なぜ

https://www.postgresql.org/docs/9.3/static/functions-json.html

SELECT 
    json_array_elements(elems->'field1') field1 
    , json_array_length(elems->'field1') field_1_length 
FROM json_values 
LIMIT 1 

私は表示されませんこの状況では、クロス結合またはウィンドウ関数が必要ですが、それらを使用して同じ結果を得ることは可能です。

関連する問題