3

Consider a table with the following rows:

id       | bigint
polygons | geometry(Polygon,4326)[]

SELECT-ing the polygons row returns an array of unreadable binary data:

SELECT polygons FROM some_table WHERE id=405;
{0103000020E61000000100000006000000B84F039E5AC0E375243935C13F402...}

Using st_AsText on the first element returns a readable output:

SELECT st_AsText(polygons[1]) FROM some_table WHERE id=405;
POLYGON((-106.4689521119 31.7547183717742 ...)

Unsurprisingly, the function only works on an element, not on an array:

SELECT st_AsText(polygons) FROM some_table WHERE id=405;
ERROR:  function st_astext(geometry[]) does not exist

Putting it in Python lingo, I'm looking for the equivalent of print [st_AsText(p) for i in polygons] in PostgreSQL.

How do I run a PostgreSQL function on all elements of an array within a SELECT statement, a-la Python's list comprehension?

Addendum I think that this isn't a strict duplicate, because How to apply a function to each element of an array column in Postgres? handles an inline array (e.g. FROM unnest(ARRAY[1.53224,0.23411234])), while this question handles a SELECT statement from a table which contains an array column. The conversion isn't trivial, at least for me.

Community
  • 1
  • 1
Adam Matan
  • 128,757
  • 147
  • 397
  • 562

1 Answers1

7

Use unnest():

SELECT st_AsText(p) 
FROM some_table, unnest(polygons) p 
WHERE id=405;
klin
  • 112,967
  • 15
  • 204
  • 232