Sql 如何在postgres中返回类型表?
我创建一个类型,然后使用它创建一个表,例如:Sql 如何在postgres中返回类型表?,sql,postgresql,types,Sql,Postgresql,Types,我创建一个类型,然后使用它创建一个表,例如: CREATE TYPE PARTOK AS (col1 VARCHAR(58), col2 VARCHAR(58), expiration VARCHAR(58), last_update BIGINT, date TIMESTAMP); CREATE TABLE PARTOK_JOB OF PARTOK; 然后我插入了几行: INSERT INTO PARTOK_JOB VALUES ('one', 'test1','nothing', 0,
CREATE TYPE PARTOK AS (col1 VARCHAR(58), col2 VARCHAR(58), expiration VARCHAR(58), last_update BIGINT, date TIMESTAMP);
CREATE TABLE PARTOK_JOB OF PARTOK;
然后我插入了几行:
INSERT INTO PARTOK_JOB VALUES ('one', 'test1','nothing', 0, null);
INSERT INTO PARTOK_JOB VALUES ('one', 'test2','nothing', 0, null);
INSERT INTO PARTOK_JOB VALUES ('one', 'test3','nothing', 0, null);
INSERT INTO PARTOK_JOB VALUES ('two', 'test3','nothing', 0, null);
我创建了一个简单的函数来返回该类型的表:
CREATE OR REPLACE FUNCTION get_partok(
in_col1 VARCHAR(40)
)
RETURNS PARTOK_JOB
LANGUAGE sql
AS
$$
SELECT * FROM partok_job WHERE col1 = in_col1 ;
$$
;
然后使用以下名称将其命名为:
SELECT * FROM get_partok('one');
问题是它只返回一行。我怎样才能让它返回所有相关记录?
是否有一种使用该类型表的方法,或者我必须定义返回表的每一列
Thx根据
SQL函数执行任意SQL语句列表,返回列表中最后一个查询的结果在简单(非集合)情况下,将返回最后一个查询结果的第一行。(请记住,除非使用ORDER BY,否则多行结果的“第一行”并没有很好的定义。)如果最后一个查询恰好没有返回任何行,则将返回null值
或者,可以通过将函数的返回类型指定为SETOF sometype,或者通过将其声明为返回表(列),将SQL函数声明为返回集合(即多行)。在这种情况下,将返回最后一个查询结果的所有行。更多详情见下文
您需要使用设置_of
。只需在代码中替换
RETURNS PARTOK_JOB
与
整个函数定义应该是
CREATE OR REPLACE FUNCTION get_partok(
in_col1 VARCHAR(40)
)
RETURNS setof PARTOK_JOB
LANGUAGE sql
AS
$$
SELECT * FROM partok_job WHERE col1 = in_col1 ;
$$
;
进行此更改后,选择
从get_partok('one')中选择*;
输出是
col1 | col2 | expiration | last_update | date
------+-------+------------+-------------+------
one | test1 | nothing | 0 |
one | test2 | nothing | 0 |
one | test3 | nothing | 0 |
(3 rows)
工作原理与解释完全一致,谢谢!
col1 | col2 | expiration | last_update | date
------+-------+------------+-------------+------
one | test1 | nothing | 0 |
one | test2 | nothing | 0 |
one | test3 | nothing | 0 |
(3 rows)