在子查询返回的每一行上调用一个函数

时间:2012-10-24 09:36:45

标签: postgresql postgis

我需要运行以下查询来提取特定点的光栅记录值。

select st_value((select rast from mytable),
    (select st_GeomFromText('POINT(30.424 -1.978)', 4326)))

但我遇到以下错误:

  

错误:用作表达式的子查询返回多行   SQL状态:21000

此功能只需要一条记录,但我需要提取所有记录的值。

3 个答案:

答案 0 :(得分:7)

如果子查询返回多行,则必须在公用表表达式(CTE / WITH查询)和FROM alias中使用它,或使用FROM (SELECT ...) alias。但在这种情况下,它看起来比它更简单:

select st_value(rast, st_GeomFromText('POINT(30.424 -1.978)', 4326))
FROM mytable;

两个子查询似乎都是不必要的。

如果你真的需要子查询,你会在语法上写一些东西:

WITH sq(rast) AS ( SELECT rast FROM mytable )
SELECT st_value(rast, st_GeomFromText('POINT(30.424 -1.978)', 4326))
FROM sq;

SELECT st_value(rast, st_GeomFromText('POINT(30.424 -1.978)', 4326))
FROM (SELECT rast FROM mytable) sq(rast);

答案 1 :(得分:3)

尝试:

Select st_value(rast),
       st_GeomFromText('POINT(30.424 -1.978)', 4326)
from mytable

答案 2 :(得分:3)

如果你有一个包含多列的函数,你可以这样做

SELECT (info).column1, (info).column2, (info).column3
FROM   (select st_value(rast, st_GeomFromText('POINT(30.424 -1.978)', 4326)) AS info
        FROM mytable
       ) AS foo