【问题标题】:Calling a function on every row returned by a subquery对子查询返回的每一行调用一个函数
【发布时间】:2012-10-24 09:36:44
【问题描述】:

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

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

但我遇到以下错误:

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

这个函数只需要一条记录,但我需要提取所有记录的值。

【问题讨论】:

    标签: postgresql postgis


    【解决方案1】:

    如果子查询返回多行,则必须在公用表表达式(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);
    

    【讨论】:

      【解决方案2】:

      试试:

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

      【讨论】:

        【解决方案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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-26
          • 1970-01-01
          • 1970-01-01
          • 2018-08-13
          • 1970-01-01
          相关资源
          最近更新 更多