generate_subscripts(array, 2) 当只有一个多维元素时返回两条记录

Posted

技术标签:

【中文标题】generate_subscripts(array, 2) 当只有一个多维元素时返回两条记录【英文标题】:generate_subscripts(array, 2) returns two records when there is only one multidimensional element 【发布时间】:2017-04-20 00:31:01 【问题描述】:

为什么当多维数组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】:

您的数组中有 两个 元素,用逗号分隔:

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

What is the difference between LATERAL and a subquery in PostgreSQL?

【讨论】:

以上是关于generate_subscripts(array, 2) 当只有一个多维元素时返回两条记录的主要内容,如果未能解决你的问题,请参考以下文章

Arrays.asList(array) 和 new ArrayList<Integer>(Arrays.asList(array)) 的区别

PHP 中哪个更快,$array[] = $value 还是 array_push($array, $value)?

C ++:array1 = array2 vs使用循环将array2的值分配给array1

Array(0) 和 array = [] 有啥区别 [重复]

数组Array常用方法

PHP中array_merge函数与array+array的区别