我想做
select col1, col2 from foo union values (null, null)
但是null
被赋予默认类型TEXT,因此我得到错误“UNION类型[例如]整数和文本无法匹配”。在特定情况下,我可以提供foo列的类型,但我正在以编程方式构造SQL语句,如果我不必随身携带列类型信息,那将是更好的选择。
有解决方法吗?
答案 0 :(得分:1)
您可以使用以下查询查询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)
可能更重要的问题是你为什么要空排?也许你可以在没有合成空行的情况下到处走动?
答案 1 :(得分:1)
像这样滥用外连接:
select col1, col2 from foo
full join (select) as dummy on false
答案 2 :(得分:0)
如果col1的类型为bar,而col2的类型为baz,那么
select col1, col2 from foo union values (null::bar, null::baz)
会工作
答案 3 :(得分:0)
实际上,你可以将NULL转换为int,你只是不能将空字符串转换为int。假设如果data1包含空字符串或NULL,则在新列中需要NULL,您可以执行以下操作:
UPDATE table SET data2 = cast(nullif(data1, '') AS int);
或
UPDATE table SET data2 = nullif(data1, '')::int;