postgresql数组/复合输出

时间:2012-11-18 02:37:11

标签: postgresql escaping

在我的应用程序中,我使用postgresql返回复合类型值,如下所示:

select row('a','b','c','d');

此查询返回:

  

(A,B,C,d)

我正在使用更复杂的类型,其中包含其他复合类型的数组等。在我的数据库层中,我解析返回的值并从中解析“解包”数组和其他组合。

问题?

select row(array[1,2,3,4]);

select row('{1,2,3,4}');

给出完全相同的输出:

  

( “{1,2,3,4}”)

如何区分这个'{1,2,3,4}'是作为常规字符串(可能由用户提供)以及何时表示为数组?

复合字段值中{}的转义序列不应该是这样的吗?

P.S。我不能使用像select * from row[1,2,3]这样的东西。

2 个答案:

答案 0 :(得分:2)

确定列类型的最安全方法是查询结果集元数据。

我无法告诉你,因为你没有指定你的框架/语言。通常,您需要扩展一些结果集类并在那里解决这种歧义。

答案 1 :(得分:1)

由于您使用的是匿名记录,因此这将具有挑战性。观察:

SELECT pg_typeof( row('{1,2,3,4}') ), pg_typeof( row(array[1,2,3,4]) );

如果可能,请使用带CREATE TYPE的命名类型而不是匿名记录(ROW()构造函数)。然后你可以检查一下这种行类型。

CREATE TYPE r1 AS (col1 text);
CREATE TYPE r2 AS (col1 integer[]);

SELECT pg_typeof( row('{1,2,3,4}')::r1 ), pg_typeof( row(array[1,2,3,4])::r2 );

正如Ondrej建议的那样,协议级结果集元数据中可能有更多细节,提供了在不使用记录类型的情况下执行此操作的方法。