2012-03-13 56 views
5

考虑如何在PostgreSQL中为CTE(Common Table Expressions)指定列类型?

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

如何指定F0和F1 bigint类型?

+0

的CTE是不是站在一个孤独的结构,而是一个TSQL的快捷方式。如果你想要一个独立的结构,那么TVP或#TEMP。 – Paparazzi 2012-03-13 01:11:57

+0

@Blam:CTE并不特定于SQL-Server/TSQL,它们是SQL标准的一部分。 – 2012-03-13 01:14:32

+0

@ muistooshort - 然后我误解了这个问题,或者不确定询问什么,删除了我的意见。希望通过可能是显式数据类型的链接指出数据类型会导致数据类型不匹配,无论如何,感谢您指出,欢呼! – 2012-03-13 01:23:35

回答

6

我想你会在你的情况下,以指定的值表达式中的类型:

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通知。

+2

你只需要在第一行输入类型:'(1 :: bigint,10 :: bigint),(2,20)'就像你期望的那样工作。 (单个列中的所有值都是单一类型。)pgAdmin在输出选项卡中显示结果数据类型。 – 2012-03-13 02:36:30

+0

@Catcall:是的,这是有道理的,列是列和所有。 – 2012-03-13 02:48:40

+0

谢谢@muistooshort,它的作品!我发现超级奇怪的是,我得到的错误是“操作符不存在:bigint = text”,这有点意外(你的int结果是有意义的)。我从epgsql(Erlang)调用了这个(带有整数参数),所以我暂时只会责怪驱动程序。 我通过将所有东西都转换成bigint来解决了这个问题,但是您的解决方案更加简洁。 #Catcall - 有道理,谢谢你的提示!考虑到我在Erlang中构建查询,它可能比现在值得的更麻烦。 – 2012-03-13 05:40:52

0

我不知道这是否会为你工作,但你铸造想在DB2中指定为我工作列

WITH CTE AS (
SELECT 
    'Apple' AS STRING1 
    ,CAST('Orange' AS VARCHAR(10000)) AS STRING2 
FROM SYSIBM . SYSDUMMY1) 
SELECT * FROM CTE 
+0

提供有关您提及的方法如何帮助您的附加信息。 – Leb 2017-01-12 20:26:09