7

我想要做

select col1, col2 from foo union values (null, null)

但是null给定了默认类型的 TEXT,所以我收到错误“UNION types [eg] integer and text cannot be match”。在特定情况下,我可以提供 foo 列的类型,但我正在以编程方式构建 SQL 语句,如果我不必随身携带列类型信息,那将是更好的选择。

有解决方法吗?

4

4 回答 4

3

您可以使用如下查询查询INFORMATION_SCHEMACOLUMNS

SELECT column_name, data_type
FROM information_schema.columns
WHERE table_name = 'mytable'

或者您可以使用 PostgreSQL 特定的形式:

SELECT attname, atttypid::regtype
FROM pg_attribute
WHERE attrelid = 'public.mytable'::regclass
  AND attnum > 0

这将为您提供表中感兴趣的列的数据类型。有了这个,在您的自动化框架中,您可以UNION通过将 NULL 转换为所需的数据类型来生成字符串以添加空行,如下所示:

SELECT col1, col2 FROM foo
UNION ALL VALUES (NULL::VARCHAR, NULL::INTEGER)

可能更重要的问题是你为什么想要空行?也许你可以在没有这个合成空行的情况下绕过?

于 2013-05-14T08:55:01.317 回答
1

像这样滥用外部联接:

select col1, col2 from foo 
full join (select) as dummy on false
于 2021-05-28T09:11:39.617 回答
0

如果 col1 是 bar 类型, col2 是 baz 类型,那么

select col1, col2 from foo union values (null::bar, null::baz)

将工作

于 2013-05-14T08:26:22.260 回答
0

实际上,您可以将 NULL 转换为 int,但不能将空字符串转换为 int。假设如果 data1 包含空字符串或 NULL,则新列中需要 NULL,您可以执行以下操作:

UPDATE table SET data2 = cast(nullif(data1, '') AS int);

或者

UPDATE table SET data2 = nullif(data1, '')::int;

参考

于 2013-11-15T09:35:11.047 回答