Как указать типы столбцов для CTE (Common Table Expressions) в PostgreSQL? - PullRequest
6 голосов
/ 13 марта 2012

Рассмотрим

WITH t (f0, f1) as (
  values 
     (1, 10),
     (2, 20)     
)...

Как мне указать, что f0 и f1 имеют тип bigint?

Ответы [ 2 ]

7 голосов
/ 13 марта 2012

Я думаю, вам нужно указать типы внутри выражения VALUES в вашем случае:

WITH t (f0, f1) as (
  values 
     (1::bigint, 10::bigint),
     (2, 20)
)...

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

Например, предположим, что у нас есть две функции:

create function f(bigint, bigint) returns bigint as $$
begin
    raise notice 'bigint';
    return $1 * $2;
end;
$$ language plpgsql;

create function f(int, int) returns int as $$
begin
    raise notice 'int';
    return $1 * $2;
end;
$$ language plpgsql;

Тогда

WITH t (f0, f1) as (
    values
        (1, 10),
        (2, 20)
)
select f(f0, f1) from t;

даст вам два int уведомления, тогда как

WITH t (f0, f1) as (
    values
        (1::bigint, 10::bigint),
        (2, 20)
)
select f(f0, f1) from t;

даст вам два bigint уведомления.

0 голосов
/ 12 января 2017

Я не знаю, сработает ли это для вас, но приведение столбца, который вы хотите указать, сработало для меня в DB2

WITH CTE AS (
SELECT 
    'Apple' AS STRING1
    ,CAST('Orange' AS VARCHAR(10000)) AS STRING2
FROM SYSIBM . SYSDUMMY1)
SELECT * FROM CTE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...