generate_subscripts(array, 2) возвращает две записи, когда существует только один многомерный элемент

Почему это возвращает 2 записи, когда существует только один многомерный элемент в многомерном массиве images?

SELECT images
FROM  (
   SELECT images, generate_subscripts(images, 2) AS s
   FROM listings
   WHERE listings.id = 2
   ) as foo;

Примечание: я сократил строку base64 для удобства просмотра.

id               | 2
created_at       | 2017-04-19 23:44:50.150913+00
posted_by        | 10209280753550922
images           | {{/9j/4AAJRgAB2dgKd/9k=,3/2/image-3-2-1492645490308.jpeg}}

dev_dolphin_db=# SELECT images FROM(SELECT images, generate_subscripts(images, 2) AS s FROM listings where listings.id = 2) as foo;
-[ RECORD 1 ]----------------------------------------------------------------------------------------------------------------------
images | {{/9j/4AAQSkZJRdgKd/9k=,3/2/image-3-2-1492645490308.jpeg}}
-[ RECORD 2 ]----------------------------------------------------------------------------------------------------------------------
images | {{/9j/4AAQSkZN2dgKd/9k=,3/2/image-3-2-1492645490308.jpeg}}

1 ответ

Решение

В вашем массиве есть два элемента, разделенных запятой:

{{/9j/4AAJRgAB2dgKd/9k=,3/2/image-3-2-1492645490308.jpeg}}

Увидеть:

SELECT *
FROM unnest('{{/9j/4AAJRgAB2dgKd/9k=,3/2/image-3-2-1492645490308.jpeg}}'::text[])

unnest
--------------------------------
/9j/4AAJRgAB2dgKd/9k=
3/2/image-3-2-1492645490308.jpeg

generate_subscripts() возвращает одну строку на элемент в указанном измерении (не одну строку на измерение). Руководство:

generate_subscripts это вспомогательная функция, которая генерирует набор допустимых индексов для указанного измерения данного массива. Нулевые строки возвращаются для массивов, у которых нет запрошенного измерения, или для массивов NULL (но действительные индексы возвращаются для элементов массива NULL).

Если предполагается, что это один элемент, его необходимо заключить в двойные кавычки, чтобы избежать особого значения запятой:

{{"/9j/4AAJRgAB2dgKd/9k=,3/2/image-3-2-1492645490308.jpeg"}}

Кроме того: в современном Postgres вы можете использовать этот более простой эквивалентный запрос:

SELECT images
FROM   listings, generate_subscripts(images, 2) s
WHERE  id = 2;

Это неявное CROSS JOIN LATERAL, Увидеть:

Другие вопросы по тегам