如何在PostgreSQL中为CTE(公用表表达式)指定列类型?

Joh*_*ith 8 postgresql

考虑

WITH t (f0, f1) as (
  values 
     (1, 10),
     (2, 20)     
)...
Run Code Online (Sandbox Code Playgroud)

如何指定f0和f1是bigint类型?

mu *_*ort 9

我认为你必须在你的案例中指定VALUES表达式中的类型:

WITH t (f0, f1) as (
  values 
     (1::bigint, 10::bigint),
     (2, 20)
)...
Run Code Online (Sandbox Code Playgroud)

您只需要第一组值上的类型,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;
Run Code Online (Sandbox Code Playgroud)

然后

WITH t (f0, f1) as (
    values
        (1, 10),
        (2, 20)
)
select f(f0, f1) from t;
Run Code Online (Sandbox Code Playgroud)

会给你两个int通知,而

WITH t (f0, f1) as (
    values
        (1::bigint, 10::bigint),
        (2, 20)
)
select f(f0, f1) from t;
Run Code Online (Sandbox Code Playgroud)

会给你两个bigint通知.

  • 你只需要在第一行输出类型:`(1 :: bigint,10 :: bigint),(2,20)`就像你期望的那样工作.(单个列中的所有值都是单个类型.)pgAdmin在输出选项卡中显示结果数据类型. (2认同)