在我的应用程序中,我使用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]
这样的东西。
答案 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建议的那样,协议级结果集元数据中可能有更多细节,提供了在不使用记录类型的情况下执行此操作的方法。