2012-03-13 23 views
5

O F0 belirtmek ve f1 tipi bigint olan nasılPostgreSQL'de CTE (Ortak Tablo İfadeleri) için sütun türleri nasıl belirlenir?

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

düşünün?

+0

Bir CTE bir yalnız bir yapıya ziyade TSQL kısayol durmak değil DB2 benim için çalıştı belirtin istediğiniz sütunu döküm eğer bilmiyorum. Tek başına bir yapı istiyorsanız TVP veya #TEMP. – Paparazzi

+0

@Blam: CTE'ler SQL-Server/TSQL'e özgü değildir, bunlar SQL standardının parçasıdır. –

+0

@muistooshort - sonra soruyu yanlış anladım ya da sorduğumdan emin değilim, yorumlarımı siliyorum. Açık veri türü olabilecek bağlantıyı işaret etmek istedim, veri türü yanlış eşleşmesine neden olacak, herşeyi işaretlediğiniz için teşekkürler, şerefe! –

cevap

6

ben size durumda DEĞERLER ifadenin içinde türlerini belirtmek zorunda düşünüyorum:

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

Yalnızca, PostgreSQL kalanını çıkarabiliriz değerlerin ilk sette türleri gerekir.

Örneğin, iki işlevi olduğunu varsayalım:

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

sana iki bigint bildirimler verecek oysa

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; 

Sonra

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

sana iki int bildirimlerini verecektir.

+2

Yalnızca ilk satırdaki yazı tipine ihtiyacınız var: '(1 :: bigint, 10 :: bigint), (2, 20)' beklediğiniz gibi çalışır. (Tek bir sütundaki tüm değerler tek tiptir.) PgAdmin, çıkan veri tipini çıktı sekmesinde görüntüler. –

+0

@Catcall: Evet, bu mantıklı, sütunlar sütunlar ve hepsi. –

+0

Teşekkür ederim @muistooshort, işe yarıyor! Süper garip bulduğum şey, elde ettiğim hatanın "operatör var değil: bigint = text" idi, ki bu biraz beklenmedik (int sonucunu anlamış olursunuz). Bunu epgsql (Erlang) 'dan (tamsayı argümanları ile) çağırıyorum, bu yüzden şimdilik sürücüyü suçlayacağım. Her şeyi bigint'e dökerek sorunu çözdüm, ancak çözümleriniz çok daha temiz. #Catcall - mantıklı, bahşiş için teşekkürler! Erlang'da sorguyu oluşturduğum düşünüldüğünde, muhtemelen şu anki değerinden daha fazla sorun var. –

0

bu sizin için çalışır, ancak

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

Bahsedilen yöntemin size nasıl yardımcı olduğu hakkında ek bilgi sağlayın. – Leb

İlgili konular