Можно ли повторно использовать выражение SELECT в выражении RETURNING? - PullRequest
0 голосов
/ 29 апреля 2018

Учитывая что-то вроде:

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

возможно ли разделить эти поля во что-то, что можно повторно использовать в выражении RETURNING, например:

INSERT INTO table_name
VALUES ...
RETURNING <here>

Что я пробовал

Я знаю, что оператор SELECT может быть вынесен в представление, но не похоже, что я смогу повторно использовать это представление в RETURNING.

Вставка в представление теоретически возможна в некоторых случаях, но кажется невозможной, если у вас есть fn и fn2.

Фактический вариант использования

Я работаю с Dapper в .NET Core и пытаюсь вернуть определенное подмножество полей из таблицы, чтобы всегда возвращаться к одному и тому же объекту.

Я мог бы создать отдельную функцию в C #, которая создала бы SELECT с этими конкретными полями и повторно использовать эту функцию вместо этого, но мне просто интересно, возможно ли это, просто используя SQL.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Вы можете сделать:

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

То есть вам не нужно использовать результаты CTE в SELECT. Это кажется действительно странным. Почему бы просто не выполнить два отдельных оператора?

Или, возможно, вы намереваетесь это:

with i as (
      INSERT INTO table_name
          VALUES ...
          RETURNING *
     )
SELECT a, b, fn(c), fn2(a, d), d
FROM i;
0 голосов
/ 29 апреля 2018

Не уверен, что это то, что вы имеете в виду

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...