2012-03-13 58 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