2012-03-13 5 views
5

PostgreSQLのCTE(Common Table Expressions)の列タイプを指定する方法は?

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

どのように私をf0とf1はBIGINT型であることを指定するのですか?考えてみましょうか

+0

CTEが唯一の構造ではなく、TSQLショートカットをスタンドではありませんあなたはDB2に私のために働い指定したい列をキャストするかどうかはわかりません。スタンドアローンの構造を望むなら、TVPまたは#TEMP。 – Paparazzi

+0

@Blam:CTEはSQL-Server/TSQLに固有のものではなく、SQL標準の一部です。 –

+0

@muistooshort - 私は質問を誤解したか、何が尋ねられたのか分からず、私のコメントを削除しました。明示的なデータ型かもしれないリンクを指摘したいと思っていたのですが、とにかくデータ型の不一致が起こります。 –

答えて

6

私はあなたがあなたのケースでVALUES式内側の種類を指定する必要があるだろうと思う:

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

あなただけの値の最初のセットの種類を必要とし、PostgreSQLは残りを推測することができます。

例えば、我々は2つの機能を持っているとします

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

はあなたに2つのbigint通知を与えるのに対し、

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; 

はあなたに2つのintの通知を行います。

+2

'(1 :: bigint、10 :: bigint)、(2、20)'は期待通りに動作します。 (単一の列のすべての値は1つのタイプです)。pgAdminは結果のデータ型を出力タブに表示します。 –

+0

@Catcall:そうですね、それは意味があります。 –

+0

ありがとう@muistooshort、それは動作します!私が非常に奇妙なことを発見したのは、私が得ていたエラーは「演算子は存在しませんでした:bigint = text」です。これはやや予期せぬものです(intの意味は理にかなっています)。私はepgsql(Erlang)からこれを(整数の引数で)呼び出すので、当面はドライバを責めます。 私はすべてをbigintにキャストして問題を解決しましたが、あなたのソリューションはよりクリーンです。 #キャットコール - 意味があります、チップのおかげで!私がErlangでクエリを構築していることを考えると、当分の間はそれは価値があるよりもおそらくもっと問題です。 –

0

これはあなたのために働くが、

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

あなたの言及した方法がどのように役立ったかに関する追加情報を提供します。 – Leb

関連する問題