相关疑难解决方法(0)

并联多个阵列

我的最后一个问题将数组传递给存储到postgres有点不清楚.现在,澄清我的目标:

我想创建一个Postgres存储过程,它将接受两个输入参数.一个将是一些数量的列表,例如(100, 40.5, 76),另一个将是一些发票的 列表('01-2222-05','01-3333-04','01-4444-08').之后我想使用这两个数字和字符列表并对它们做一些事情.例如,我想从这一组数字中取出每个金额,并将其分配给相应的发票.

在Oracle中类似的东西看起来像这样:

SOME_PACKAGE.SOME_PROCEDURE (
    789,
    SYSDATE,
    SIMPLEARRAYTYPE ('01-2222-05','01-3333-04','01-4444-08'), 
    NUMBER_TABLE (100,40.5,76),
    'EUR',      
    1, 
    P_CODE,
    P_MESSAGE);
Run Code Online (Sandbox Code Playgroud)

当然,这两种类型SIMPLEARRAYTYPE,并NUMBER_TABLE出现在靠前的DB定义.

arrays postgresql arraylist plpgsql set-returning-functions

14
推荐指数
2
解决办法
8679
查看次数

子查询中的动态字段名称?

我有一个类似于以下的表:

CREATE TABLE stats (
  name character varying(15),
  q001001 numeric(9,0),
  q001002 numeric(9,0),
  q001003 numeric(9,0),
  q001004 numeric(9,0),
  q001005 numeric(9,0)
)
Run Code Online (Sandbox Code Playgroud)

我需要在这个表中查询各个字段的总和,如下所示:

SELECT sum(q001001) as total001,
       sum(q001002) as total002,
       sum(q001005) as total005,
FROM stats;
Run Code Online (Sandbox Code Playgroud)

这会产生一行数据和三列数据.
但是,出于报告目的,我需要以相反的方式列出结果.我需要三行和一列(好吧,实际上是两个,第一个是总和的字段),如下所示:

FieldName | SUM
----------+-------
q001001   |  12345
q001002   |  5432
q001005   |  986
Run Code Online (Sandbox Code Playgroud)

我想使用这样的一些SQL,其中field_name(来自stats表中字段名称的查找表)用于子查询:

select l.field_name, (select sum(l.field_name) from stats)
from stats_field_names_lookup as l
where l.field_name in ('Q001001', 'Q001002', 'Q001005');
Run Code Online (Sandbox Code Playgroud)

这里的想法是,sum(l.field_name)将替换为相关的实际字段名称,对于WHERE子句中的每个名称,然后进行评估以提供正确的求和结果值.但是,这会因以下错误而失败:

函数和(字符变化)不存在

因为值有文字/字符.如何将该字符值转换为要正确计算的未加引号的字符串?

这个SQL有效.但是,当然,每个都给出相同的和值field_name,因为它q001001在这里是硬编码的.

select l.field_name, …
Run Code Online (Sandbox Code Playgroud)

sql postgresql unpivot dynamic-sql aggregate-functions

6
推荐指数
1
解决办法
660
查看次数

select子句中多个set-returns函数的预期行为是什么?

我试图通过两个set-returns函数得到一个"交叉连接",但在某些情况下我没有得到"交叉连接",请参阅示例

行为1:当设置的长度相同时,它会逐个匹配每个集合中的项目

postgres=# SELECT generate_series(1,3), generate_series(5,7) order by 1,2;
 generate_series | generate_series 
-----------------+-----------------
               1 |               5
               2 |               6
               3 |               7
(3 rows)

行为2:当设置的长度不同时,它会"交叉连接"这些集合

postgres=# SELECT generate_series(1,2), generate_series(5,7) order by 1,2;
 generate_series | generate_series 
-----------------+-----------------
               1 |               5
               1 |               6
               1 |               7
               2 |               5
               2 |               6
               2 |               7
(6 rows)

我想我在这里不了解一些事情,有人可以解释一下这种行为吗?

编辑:另一个例子,比以前更奇怪

postgres=# SELECT generate_series(1,2) x, generate_series(1,4) y order by x,y;
 x | y 
---+---
 1 | 1
 1 | 3 …

sql postgresql cross-join set-returning-functions

5
推荐指数
1
解决办法
951
查看次数