2017-02-13 12 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]), как б;

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

(2 строки)

Это кажется, когда длина массивов равны, что-то идет не так. Может ли кто-нибудь сказать мне, почему так.

+0

Моя версия postgresql - 9.4.4. Я установил 9.6.2 и запустил тестовый sql, ничего не изменилось. –

+0

[SQL multiple 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 не будут в конце их входными данными одновременно), мы решили вместо этого только повторить n строк до все SRF исчерпаны, возвращая NULL для уже исчерпанных. We считает, что предыдущее поведение было слишком запутанным, неожиданным и фактически не особенно полезно.

+0

О, вот почему. Огромное спасибо. И когда PostgreSQL добавит это изменение, будет ли оно в PostgreSQL 10? –

+0

Да. Я добавил подробности об этом в ответ. –