Postgres类型的结果列

时间:2014-11-22 17:24:02

标签: postgresql

在postgres中,有一个函数pg_typeof,它将给出一个字段的类型。例如:

-- Original query
select name, age, descriptions from things LIMIT 1;
-- Meta query
select pg_typeof(name), pg_typeof(age), pg_typeof(descriptions) from things LIMIT 1;

     pg_typeof     | pg_typeof | pg_typeof 
-------------------+-----------+-----------
 character varying | integer   | text[]

这是一个非常酷的功能。我感兴趣的是如何在空表上执行类似的技术。如果things表中没有任何内容,则上一个命令不返回任何行。仅从查询中,我希望能够查看查询的结果列的类型。请注意,我所要求的不是获取表的列类型。我已经了解information_schema.columns。设想一个不能整齐地映射到表行的查询或具有大量FK约束的情况。我不想创建虚拟数据以使上述技术有效。如果有人知道这样做的方法(我知道F#有一个带有一些魔法的库),我将不胜感激。如果问题不清楚,请告诉我如何改进它。感谢。

1 个答案:

答案 0 :(得分:6)

由于值具有类型(由规划器推导),即使其值为NULL,也可以创建仅包含NULL的虚拟行,并测试NULL的类型。您可以使用UNION执行此操作,其中列类型基于第一个(空)结果集确定,第二个结果集只具有正确的NULL数。

这是一个我只是tested on SQLFiddle的例子;更复杂的示例可能需要额外的子查询以允许空结果为UNIONed(例如,您不能在这里使用LIMIT 0),但请注意它适用于函数的返回类型以及基数列:

Create Table Test ( id int, name text );

Select pg_typeof(id) as id_type, pg_typeof(name) as name_type, pg_typeof(len) as len_type
From 
(
    Select id, name, length(name) as len From test
    Union
    Select null, null, null
) as x;

(注意:SQLFiddle结果的JSON表示法似乎是在遇到不知道如何显示的列类型时会发生的情况。)