如何以通用方式在Postgres中添加空行

时间:2013-05-14 08:23:08

标签: sql postgresql

我想做

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

但是null被赋予默认类型TEXT,因此我得到错误“UNION类型[例如]整数和文本无法匹配”。在特定情况下,我可以提供foo列的类型,但我正在以编程方式构造SQL语句,如果我不必随身携带列类型信息,那将是更好的选择。

有解决方法吗?

4 个答案:

答案 0 :(得分:1)

您可以使用以下查询查询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)

可能更重要的问题是你为什么要空排?也许你可以在没有合成空行的情况下到处走动?

答案 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;

Reference