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?
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?
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.
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. –
@Catcall: Sí, tiene sentido, las columnas son columnas y todo. –
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. –
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
Proporcione información adicional sobre cómo le ayudó el método que mencionó. – Leb
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
@Blam: los CTE no son específicos de SQL-Server/TSQL, son parte del estándar SQL. –
@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! –