相关疑难解决方法(0)

如何在SQL查询中使用(func()).*语法避免多重函数的演绎?

上下文

当函数返回a TABLE或a时SETOF composite-type,如此示例函数:

CREATE FUNCTION func(n int) returns table(i int, j bigint) as $$
BEGIN
  RETURN QUERY select 1,n::bigint 
      union all select 2,n*n::bigint
      union all select 3,n*n*n::bigint;
END
$$ language plpgsql;
Run Code Online (Sandbox Code Playgroud)

结果可以通过各种方法访问:

1)select * from func(3)将产生这些输出列:

 i | j 
---+---
 1 |  3
 2 |  9
 3 | 27

2)select func(3)将只生成一个ROW类型的输出列.

 func  
-------
 (1,3)
 (2,9)
 (3,27)

3)select (func(3)).*会产生#1:

 i | j 
---+---
 1 |  3
 2 |  9
 3 | …

postgresql user-defined-functions

14
推荐指数
1
解决办法
1461
查看次数

Postgres函数返回表不返回列中的数据

我有一个Postgres函数返回一个表:

CREATE OR REPLACE FUNCTION testFunction() RETURNS TABLE(a int, b int) AS
$BODY$
DECLARE a int DEFAULT 0;
DECLARE b int DEFAULT 0;
BEGIN
CREATE TABLE tempTable AS SELECT a, b;
RETURN QUERY SELECT * FROM tempTable; 
DROP TABLE tempTable;
END;
$BODY$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

此函数不以行和列形式返回数据.相反,它返回数据为:

(0,0)
Run Code Online (Sandbox Code Playgroud)

这导致Coldfusion cfquery块在提取数据时出现问题.从此函数返回表时,如何获取行和列中的数据?换句话说:为什么PL/pgSQL函数不会将数据作为列返回?

sql postgresql plpgsql postgresql-9.1

11
推荐指数
2
解决办法
8362
查看次数

如何匹配复合类型数组中的元素?

假设我们有两个表:

CREATE TABLE element (
    pk1 BIGINT NOT NULL,
    pk2 BIGINT NOT NULL,
    pk3 BIGINT NOT NULL,
    -- other columns ...
    PRIMARY KEY (pk1, pk2, pk3)
);

CREATE TYPE element_pk_t AS (
    pk1 BIGINT,
    pk2 BIGINT,
    pk3 BIGINT
);

CREATE TABLE collection (
    id BIGINT,
    elements element_pk_t[] NOT NULL,
);
Run Code Online (Sandbox Code Playgroud)

具有element复合PK。自定义类型element_pk_t注册匹配的复合类型。该collection表包含数组element_pk_t

我想在单个查询中查询表中elementPK 与 selected 中的元素匹配的所有行。collection.elements

我尝试过的:

SELECT * 
FROM element 
WHERE (pk1, pk2, pk3) IN (SELECT unnest(elements) 
                          FROM collection …
Run Code Online (Sandbox Code Playgroud)

sql postgresql rowtype sql-in

2
推荐指数
1
解决办法
1491
查看次数