当只有一个多维元素

时间:2017-04-20 00:31:02

标签: postgresql multidimensional-array set-returning-functions

为什么当多维数组images中只有一个多维元素时,它会返回2条记录?

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 个答案:

答案 0 :(得分: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()在指定维度中每个元素返回一行(每个维度不是一行)。 The manual

  

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。参见: