2017-04-24 4 views
0

私はPostgreSQL 9.4.5,64ビットをWindows上で使用しています。 私はいくつかの不規則なサイズの配列を持っています。私は私がこれを実行すると、列AAで空の配列に沿って床に落ちている、私はnull値のjson_array_elements

aa | bb 
------- 
11 | 2 
21 | 3 
22 | 3 
23 | 3 

を取得し、

with outside as (select (json_array_elements('[[],[11],[21,22,23]]'::json)) aa, json_array_elements('[1,2,3]'::json)bb) 
select json_array_elements_text(aa), bb from outside 

ただし、次のコードに似た配列を拡大する json_array_elementsを使用したいですコラムBBの1の値で

私が取得したいと思い

aa | bb 
---------- 
null | 1 
11 | 2 
21 | 3 
22 | 3 
23 | 3 

また、これはPostgreSQLのバグですか?

答えて

1

混乱のように思えます。

:あなた(おそらく)は、あなたが「パッド」行に JOIN &使用 NULL Sの反対側から行を維持したい JOIN &の一方の側の行がない場合は、 OUTER JOINをする必要があります
with outside as (
    select json_array_elements('[[],[11],[21,22,23]]') aa, 
      json_array_elements('[1,2,3]') bb 
) 
select a, bb 
from  outside 
left join json_array_elements_text(aa) a on true 

:それあなたがLATERAL joinsを使用しているときは、直接機能(SRF)を返すセットを使用する場合、暗黙的である(、が参加する条件としてon trueを見て奇妙に見えるかもしれませんが、それは実際には非常に一般的ですFROM句)。

http://rextester.com/KNW13145

編集:あなたの元のクエリは、直接JOINを伴うが、悪化していません:あなたはSELECT句でSRFを使用しています。これはです。CROSS JOINですが、実際にはit has its own rulesです。 Don't use thatあなたが何をしているのか、なぜそれが必要なのかが分かっていない限り、

+0

ありがとうございました - 良い答え、左に参加するときれいになり、klinのケースステートメント – newman911

1

これはバグではありません。 json_array_elements_text('[null]')nullを返します。json_array_elements_text('[]')は何も返しません。私自身の問題を通して作業する

with outside as (
    select (
     json_array_elements('[[],[11],[21,22,23]]'::json)) aa, 
     json_array_elements('[1,2,3]'::json) bb 
) 
select elem as aa, bb 
from outside, 
json_array_elements_text(case when aa::text = '[]' then '[null]'::json else aa end) elem; 

aa | bb 
----+---- 
    | 1 
11 | 2 
21 | 3 
22 | 3 
23 | 3 
(5 rows)  
+0

私はjson_array_elements_textがあなたの説明どおりに動作することに同意します、なぜその正しい動作ですか? – newman911

+0

''[null]' :: json'と' '[]' :: json'の間に違いがあるためです。最初の配列はnullを含み、2番目の配列は空です。この関数は、空の配列から何も戻せません。 – klin

0

、私は1つの可能な答えを持っているが、それはあなたが右の機能を使用して、間違ったJOIN

With initial as (select '[[],[11],[21,22,23]]'::json as a, '[1,2,3]'::json as b), 
    Q1 as (select json_array_elements(a) as aa, json_array_elements(b) bb from initial), 
    Q2 as (select ARRAY[aa->>0, aa->>1, aa->>2] as aaa, bb as bbb, ARRAY[0,1,2] as ccc from q1), 
    -- where the indicices are computed in a separate query by looping from 0 to json_array_length(...) 
    Q3 as (select unnest(aaa) as aaaa, bbb as bbbb, unnest(ccc) as cccc from q2) 

Select aaaa, bbbb from q3 where aaaa is not null or cccc = 0