是否可以将SELECT表达式重用到RETURNING表达式中?

时间:2018-04-29 14:36:42

标签: sql postgresql

给出类似的东西:

SELECT 
    a,
    b,
    fn(c),
    fn2(a, d),
    d
FROM table_name
...

是否可以将这些字段分解为可以在RETURNING语句中重用的内容,如:

INSERT INTO table_name
VALUES ...
RETURNING <here>

我尝试了什么

我知道SELECT语句可以被分解到视图中,但似乎我不能在RETURNING中重用该视图。

在某些情况下,理论上可以插入视图,但如果您有fnfn2,则似乎不可能。

实际用例

我正在使用.NET Core上的Dapper,我正在尝试从表中返回一个特定的字段子集,以返回始终相同的对象。

我可以在C#中创建一个单独的函数,它将使SELECT包含这些特定字段并重用该函数,但我只是想知道这是否可以使用SQL。

2 个答案:

答案 0 :(得分:1)

你可以这样做:

with i as (
      INSERT INTO table_name
          VALUES ...
          RETURNING *
     )
SELECT a, b, fn(c), fn2(a, d), d
FROM table_name;

也就是说,您不必在SELECT中使用CTE的结果。这看起来很奇怪。为什么不直接执行两个语句?

或者,也许你打算这样:

with i as (
      INSERT INTO table_name
          VALUES ...
          RETURNING *
     )
SELECT a, b, fn(c), fn2(a, d), d
FROM i;

答案 1 :(得分:0)

不确定这是不是你的意思

create function fn (param integer) returns integer
language sql as
    'select 1000 * param;';

create table a (
    id serial not null,
    data character varying(256) not null
);

insert into a (data)
select 'test'
returning id, fn(id);