0

爲什麼當多維數組中只有一個多維元素時返回2條記錄imagesgenerate_subscripts(array,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}} 
+0

是的,對不起!不知道如果沒有我的回答標記,這個人是如何滑倒的。 – dman

回答

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。請參閱: