2

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

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

此查询返回:

(A B C D)

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

问题?

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

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

给出完全相同的输出:

("{1,2,3,4}")

我如何区分这'{1,2,3,4}'意味着什么是常规字符串(可能由用户提供)和什么时候意味着它是数组?

复合字段值中不应该有类似转义序列的东西{吗?}

PS我不能使用类似的东西select * from row[1,2,3]

4

2 回答 2

2

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

我不能告诉你怎么做,因为你没有指定你的框架/语言。一般来说,您需要扩展一些结果集类并在那里解决这种歧义。

于 2012-11-18T03:12:56.603 回答
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 建议的那样,协议级结果集元数据中可能有更多细节,提供了无需使用记录类型即可完成此操作的方法。

于 2012-11-18T03:50:42.477 回答