如何访问PostgreSQL中的记录元素?

问题描述 投票:0回答:3

PostgreSQL v8.2(Greenplum)

CREATE OR REPLACE FUNCTION util.retrec(OUT p1 date, OUT p2 boolean)
RETURNS RECORD
AS
$BODY$
DECLARE
BEGIN
 p1 := current_date;
 p2 := true;
 RETURN;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;

SELECT util.retrec();

这会返回

(2016-03-24,t)
- 我如何分别取出这两个值?

我可以与

SELECT p1,p2 FROM util.retrec();
交互地执行此操作,但是如何将两个值分配给过程中的两个变量?我试过这个:

SELECT util.retrec() INTO r1, r2;

不走运,这会尝试将记录分配给 r1。

database postgresql record tablerow greenplum
3个回答
5
投票
SELECT the_date, the_bool FROM util.retrec();

只需列出字段及其名称,就可以了。


0
投票

这里有几种方法:

do $$
declare
  r1 date;
  r2 boolean;
  r record;
begin
  r := retrec();
  raise info '%', r;
  raise info '%', r.p1;
  raise info '%', r.p2;

  select * into r from retrec();
  raise info '%', r;
  raise info '%', r.p1;
  raise info '%', r.p2;

  select * into r1, r2 from retrec();
  raise info '%, %', r1, r2;
end; $$ language plpgsql;

注意它是在 PostgreSQL 9.5 上测试的


0
投票

*根据我的研究,没有简单的方法来访问记录(行)的元素。

例如,您创建

person
表,然后向其中插入 2 行,如下所示:

CREATE TABLE person (
  id INTEGER,
  name VARCHAR(20),
  age INTEGER
);

INSERT INTO person (id, name, age) 
VALUES (1, 'John', 27), (2, 'David', 32);

然后,您创建

my_func()
函数,该函数返回带有
person_row
的记录(行),如下所示:

CREATE FUNCTION my_func()
RETURNS RECORD
AS $$
DECLARE
  person_row RECORD; -- Here
BEGIN
  SELECT * INTO person_row FROM person WHERE id = 2;
  RETURN person_row;
END;
$$ LANGUAGE plpgsql;

然后,调用

my_func()
会得到一条记录(行),如下所示:

postgres=# SELECT my_func();
   my_func
--------------
 (2,David,32)
(1 row)

现在,您可以使用

to_json()
to_jsonb()
row_to_json()
访问记录(行)的元素,如下所示:

postgres=# SELECT to_json(my_func())->'name' AS name;
  name
---------
 "David"
(1 row)

postgres=# SELECT to_jsonb(my_func())->'name' AS name;
  name
---------
 "David"
(1 row)

postgres=# SELECT row_to_json(my_func())->'name' AS name;
  name
---------
 "David"
(1 row)

*备注:

  • 可以省略

    AS name

  • 文档解释了这些功能。

此外,您可以使用trim()

"
修剪
"David"
,如下所示。 *小心,省略
::VARCHAR(20)
会得到 错误:

postgres=# SELECT trim(BOTH '"' FROM (to_json(my_func())->'name')::VARCHAR(20)) AS name;
 name
-------
 David
(1 row)

postgres=# SELECT trim(BOTH '"' FROM (to_jsonb(my_func())->'name')::VARCHAR(20)) AS name;
 name
-------
 David
(1 row)

postgres=# SELECT trim(BOTH '"' FROM (row_to_json(my_func())->'name')::VARCHAR(20)) AS name;
 name
-------
 David
(1 row)
© www.soinside.com 2019 - 2024. All rights reserved.