我想要做
select col1, col2 from foo union values (null, null)
但是null
给定了默认类型的 TEXT,所以我收到错误“UNION types [eg] integer and text cannot be match”。在特定情况下,我可以提供 foo 列的类型,但我正在以编程方式构建 SQL 语句,如果我不必随身携带列类型信息,那将是更好的选择。
有解决方法吗?
我想要做
select col1, col2 from foo union values (null, null)
但是null
给定了默认类型的 TEXT,所以我收到错误“UNION types [eg] integer and text cannot be match”。在特定情况下,我可以提供 foo 列的类型,但我正在以编程方式构建 SQL 语句,如果我不必随身携带列类型信息,那将是更好的选择。
有解决方法吗?
您可以使用如下查询查询INFORMATION_SCHEMA
表COLUMNS
:
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)
可能更重要的问题是你为什么想要空行?也许你可以在没有这个合成空行的情况下绕过?
像这样滥用外部联接:
select col1, col2 from foo
full join (select) as dummy on false
如果 col1 是 bar 类型, col2 是 baz 类型,那么
select col1, col2 from foo union values (null::bar, null::baz)
将工作
实际上,您可以将 NULL 转换为 int,但不能将空字符串转换为 int。假设如果 data1 包含空字符串或 NULL,则新列中需要 NULL,您可以执行以下操作:
UPDATE table SET data2 = cast(nullif(data1, '') AS int);
或者
UPDATE table SET data2 = nullif(data1, '')::int;