ST_GeneratePoints()
是一个标量函数,所以你可以把它直接插入到set-returningST_DumpPoints()
中,就在select
列表中.Demo at db<>fiddle:
CREATE TABLE schema.table2 AS
SELECT column1,
column2,
(st_dumppoints(st_generatepoints(geom, column1::int)) ).geom
FROM table1
WHERE column2 = '01';
select column1, column2, st_astext(geom) from schema.table2;
column1 |
column2 |
st_astext |
2 |
01 |
POINT(5.86390304259572 1.927184679457311) |
2 |
01 |
POINT(3.212729817760193 7.706451275408435) |
3 |
01 |
POINT(16.515447825106357 22.141316310508124) |
3 |
01 |
POINT(25.303230663190877 25.957851538628983) |
3 |
01 |
POINT(13.569699797511326 18.562723639342707) |
如果你想坚持你的当前布局,你需要把WHERE
列表移动到after,FROM
列表—你可能得到的语法错误是因为你把条件放在了它的正中间.
对于导致隐式连接的,
commas也要非常小心.考虑显式使用CROSS JOIN LATERAL
,因为这就是你使用,
逗号的意思:
CREATE TABLE schema.table3 AS
SELECT column1, column2, dp.geom
FROM table1
CROSS JOIN LATERAL st_dumppoints(st_generatepoints(geom,column1::int)) AS dp
WHERE column2 = '01';
注意引用:
'01'
是常数text
值
"01"
是对同名列或变量的引用
我敢打赌,你想要前者,而不是后者,并且修复了from..where..,
逗号的问题,你可能会得到一个错误,说没有找到列"01"
.Chapter 4. SQL Syntax, section 4.1. Lexical Structure涵盖了这个主题.
从技术上讲,将列命名为"01"
,然后搜索column2
中的值等于列"01"
中的值的行(如the demo所示)并不无效,但我不认为这是您想要的,而且这不是一个非常清晰/实用的命名系统.你甚至可以命名一列"
(双引号字符)或
(单个空格),但虽然这在技术上并没有错误,但我想说在道德上这是相当邪恶的.