如何从PostgreSQL 9.4中的匿名行类型中获取第一个字段?

如何从PostgreSQL 9.4中的匿名行类型中获取第一个字段?,sql,postgresql,Sql,Postgresql,如何在同一查询中获取0?我想下面的工作,但有任何简单的方法吗 =# select row(0, 1) ; row ------- (0,1) (1 row) 类似数组的语法不太好[0] 谢谢 您的行类型是匿名的,因此无法轻松访问其元素。您可以做的是创建一个类型,然后将匿名行强制转换为该类型,并访问该类型中定义的元素: =# select json_agg(row(0, 1))->0->'f1' ; ?column? ---------- 0 (1 row) 正如Crai

如何在同一查询中获取
0
?我想下面的工作,但有任何简单的方法吗

=# select row(0, 1) ;
  row
-------
 (0,1)
(1 row)
类似数组的语法不太好
[0]


谢谢

您的行类型是匿名的,因此无法轻松访问其元素。您可以做的是创建一个
类型
,然后将匿名行强制转换为该类型,并访问该类型中定义的元素:

=# select json_agg(row(0, 1))->0->'f1' ;
 ?column?
----------
 0
(1 row)

正如Craig Ringer在您的问题中所评论的那样,如果您能提供帮助,您应该避免首先生成匿名行,并键入您在数据模型和查询中使用的任何数据。

json解决方案非常优雅。为了好玩,这是一个使用regexp(更丑陋)的解决方案:


将行转换为文本时,PostgreSQL使用带引号的CSV格式。我找不到任何将引用的CSV导入数组的工具,因此以上内容主要是通过正则表达式进行的粗略文本操作。也许有人会发现这很有用

如果只需要任何行中的第一个元素,请将该行转换为JSON并选择f1

WITH r AS (SELECT row('quotes, "commas",
and a line break".',null,null,'"fourth,field"')::text AS r)
--WITH r AS (SELECT row('',null,null,'')::text AS r)
--WITH r AS (SELECT row(0,1)::text AS r)
SELECT CASE WHEN r.r ~ '^\("",' THEN ''
            WHEN r.r ~ '^\("' THEN regexp_replace(regexp_replace(regexp_replace(right(r.r, -2), '""', '\"', 'g'), '([^\\])",.*', '\1'), '\\"', '"', 'g')
            ELSE (regexp_matches(right(r.r, -1), '^[^,]*'))[1] END
FROM r
或者,如果总是有两个整数或严格结构,则可以创建一个临时表(或类型)和一个选择第一列的函数

SELECT row_to_json(row(0,1))->'f1'
资源:


构造函数生成匿名记录。您可以(ab)使用
行到行json
。不能使用数组运算符对它们进行索引,因为它们不是数组。字段的类型可能不同。实际上,PostgreSQL对匿名记录的支持是有限的,依赖它们通常不是一个好主意。Postgresql没有匿名记录的访问器,这太令人伤心了!这可能是一个正确的答案,至少对我来说是完美的。如果有另一种方法没有声明新数据类型的负担(比如使用匿名数据类型),那么很高兴看到它。谢谢
SELECT row_to_json(row(0,1))->'f1'
CREATE TABLE tmptable(f1 int, f2 int);
CREATE FUNCTION gettmpf1(tmptable) RETURNS int AS 'SELECT $1.f1' LANGUAGE SQL;

SELECT gettmpf1(ROW(0,1));