【问题标题】:SELECT ... INTO a variable within a postgres CTESELECT ... INTO postgres CTE 中的变量
【发布时间】:2021-06-09 19:11:36
【问题描述】:

我想在 plpgsql 函数中执行此操作

WITH set1 AS (

  select * 
  from table1
  where ... -- reduce table1 to the small working set once for multiple reuse

), query_only_for_select_into AS (

  select id 
  into my_variable_declared_earlier
  from set1 
  where foo = 'bar'
  
)
select my_variable_declared_earlier as my_bar
  , *
from set1
where foo <> 'bar'

但 Postgres 抛出错误

ERROR:  SELECT ... INTO is not allowed here

我猜这是因为 select ... into 在 CTE 中。但我在文档或网络上找不到任何关于它的内容。也许我只是搞砸了select ... into 语法?

【问题讨论】:

    标签: postgresql common-table-expression select-into


    【解决方案1】:

    SQL 没有变量 - 它们是过程语言(例如 PL/pgSQL)的一部分,而不是查询语言。

    但我看不出你需要一个的原因:

    WITH set1 AS (
    
      select * 
      from table1
      where ... -- reduce table1 to the small working set once for multiple reuse
    
    ), query_only_for_select_into AS (
      select id as my_variable_declared_earlier
      from set1 
      where foo = 'bar'
    )
    select qs.my_variable_declared_earlier as my_bar,
           *
    from set1
      join query_only_for_select_into qs on ...
    where foo <> 'bar'
    

    如果你确定query_only_for_select_into 只返回一行,你可以使用:

    select qs.my_variable_declared_earlier as my_bar,
           *
    from set1
      cross join query_only_for_select_into qs
    where foo <> 'bar'
    

    【讨论】:

    • 你说得对……我忘了说这是在 plpgsql 函数中。我修改了问题。我最终也像你一样做了query_only_for_select_into,但我有一些直觉,交叉连接(即使是单行,我确实有)会比选择中的变量引用慢,因此问题。
    【解决方案2】:

    SELECT ... INTO variable 是 PL/pgSQL 语法,您只能与顶级 SELECT(返回结果的那个)一起使用它。可以这样想:PL/pgSQL 运行一条 SQL 语句并将结果存储在某处.

    但您不需要这样做:只需在主查询的FROM 子句中包含query_only_for_select_into,然后您就可以在那里访问它的列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-20
      • 2011-04-19
      • 1970-01-01
      • 2010-11-23
      • 2016-07-26
      • 1970-01-01
      • 2012-10-05
      • 1970-01-01
      相关资源
      最近更新 更多