如何从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));