2012-03-13 26 views
5

Considere¿Cómo se especifican los tipos de columna para CTE (Common Table Expressions) en PostgreSQL?

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

¿Cómo se especifica que f0 y f1 son de tipo BIGINT?

+0

Un CTE no es algo a destacar una estructura solitaria, sino más bien un acceso directo TSQL. Si desea una estructura independiente, TVP o #TEMP. – Paparazzi

+0

@Blam: los CTE no son específicos de SQL-Server/TSQL, son parte del estándar SQL. –

+0

@muistooshort - luego entendí mal la pregunta o no estoy seguro de lo que se pregunta, eliminando mis comentarios. Quería señalar a través del enlace que podría ser un tipo de datos explícito que hará que el tipo de datos no coincida, de todos modos, ¡Gracias por señalarlo, aplausos! –

Respuesta

6

creo que tendría que especificar los tipos dentro de la expresión de valores en su caso:

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

Sólo necesita los tipos en el primer conjunto de valores, PostgreSQL puede deducir el resto.

Por ejemplo, suponga que tiene dos funciones:

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; 

Entonces

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

le dará dos int avisos mientras que

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

le daría dos bigint avisos.

+2

Solo necesita el tipo de conversión en la primera fila: '(1 :: bigint, 10 :: bigint), (2, 20)' funciona como era de esperar. (Todos los valores en una sola columna son de un solo tipo.) PgAdmin muestra el tipo de datos resultante en la pestaña de salida. –

+0

@Catcall: Sí, tiene sentido, las columnas son columnas y todo. –

+0

Gracias @muistooshort, ¡funciona! Lo que encontré super extraño es que el error que estaba obteniendo era "el operador no existe: bigint = text", que es algo inesperado (el resultado de int tiene sentido). Estoy llamando a esto (con argumentos enteros) desde epgsql (Erlang), así que culpo al controlador por el momento. He resuelto el problema lanzando todo a bigint, pero sus soluciones son mucho más limpias. #Catcall - tiene sentido, gracias por la sugerencia! Probablemente sea más problemático de lo que vale por el momento, teniendo en cuenta que estoy construyendo la consulta en Erlang. –

0

No sé si esto funciona para usted, pero echando la columna que desea especificar trabajado para mí en DB2

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

Proporcione información adicional sobre cómo le ayudó el método que mencionó. – Leb

Cuestiones relacionadas