相关疑难解决方法(0)

在PostgreSQL中是否有类似两个数组的zip()函数?

我在PostgreSQL中有两个相同长度的数组值:

{a,b,c}{d,e,f}

我想把它们结合起来

{{a,d},{b,e},{c,f}}

有没有办法做到这一点?

sql arrays postgresql

21
推荐指数
2
解决办法
7298
查看次数

为什么PostgreSQL数组在C中的访问速度比在PL/pgSQL中快得多?

我有一个表模式,其中包含一个int数组列,以及一个自定义聚合函数,它对数组内容求和.换句话说,给出以下内容:

CREATE TABLE foo (stuff INT[]);

INSERT INTO foo VALUES ({ 1, 2, 3 });
INSERT INTO foo VALUES ({ 4, 5, 6 });
Run Code Online (Sandbox Code Playgroud)

我需要一个可以返回的"sum"函数{ 5, 7, 9 }.正确运行的PL/pgSQL版本如下:

CREATE OR REPLACE FUNCTION array_add(array1 int[], array2 int[]) RETURNS int[] AS $$
DECLARE
    result int[] := ARRAY[]::integer[];
    l int;
BEGIN
  ---
  --- First check if either input is NULL, and return the other if it is
  ---
  IF array1 IS NULL OR array1 = '{}' THEN
    RETURN array2;
  ELSEIF …
Run Code Online (Sandbox Code Playgroud)

c arrays postgresql plpgsql aggregate-functions

19
推荐指数
2
解决办法
3616
查看次数

PostgreSQL中的并行unfst()和排序顺序

我明白使用

SELECT unnest(ARRAY[5,3,9]) as id
Run Code Online (Sandbox Code Playgroud)

如果没有ORDER BY子句,则不保证结果集的顺序.我可以得到:

id
--
3
5
9
Run Code Online (Sandbox Code Playgroud)

但是以下请求呢:

SELECT
  unnest(ARRAY[5,3,9]) as id,
  unnest(ARRAY(select generate_series(1, array_length(ARRAY[5,3,9], 1)))) as idx
ORDER BY idx ASC
Run Code Online (Sandbox Code Playgroud)

是否保证2个unnest()调用(具有相同的长度)将并行展开,并且索引idx确实匹配数组中项目的位置?

我正在使用PostgreSQL 9.3.3.

sql postgresql unnest postgresql-9.3 set-returning-functions

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

如何使用PostgreSQL中的函数插入多行

我想在PostgreSQL中的函数表中插入多行.

这是我的桌子

CREATE TABLE mahasiswa
(
  nim CHAR(10),
  nama VACHAR(40)
  CONSTRAINT pk_nim PRIMARY KEY (nim)
)
;
Run Code Online (Sandbox Code Playgroud)

这就是我创造的功能

CREATE FUNCTION insertdata(CHAR(10),varchar(40)) 
       RETURNS VOID AS 
       $$ 
         INSERT INTO mahasiswa VALUES ($1,$2); 
       $$ 
       LANGUAGE 'sql';
Run Code Online (Sandbox Code Playgroud)

当我这样调用函数时

SELECT insertdata ('1234567890','Nahrun'),
('0987654321','Hartono');
Run Code Online (Sandbox Code Playgroud)

只插入一行.

如何修改我的函数以一次插入多行?

postgresql function plpgsql sql-insert postgresql-9.3

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

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
查看次数

使用 JSON 参数的 Postgres 批量插入函数

这是plpgsqlpostgres的一个函数9.6。它尝试INSERT一行,如果插入没有失败(由于违反键约束),那么它会运行更多的命令。

CREATE FUNCTION foo(int, text, text)
  RETURNS void AS
$$
BEGIN
  INSERT INTO table1 (id, val1, val2) VALUES ($1, $2, $3) ON CONFLICT DO NOTHING;
  IF FOUND THEN
    INSERT INTO table2 (table1_id, val1) VALUES ($1, $2);
    UPDATE table3 SET (val2, time) = ($3, now()) WHERE table1_id = $1;
  END IF;
END
$$
Run Code Online (Sandbox Code Playgroud)

这个函数处理单条记录,但如何修改它来处理一批数千条记录?

我找到了一个答案,它建议将 3 个函数参数中的每一个都设为数组。但是有没有办法做到这一点,我传递的参数更能代表记录在我的应用程序中的外观?

例如,理想的解决方案是我的应用程序代码调用select foo($1),其中参数$1对象JSON 数组,其中每个内部对象都是要插入的记录。

[ 
  { "id": "1", "val1": …
Run Code Online (Sandbox Code Playgroud)

sql postgresql json plpgsql sql-insert

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

使用string_to_array()进行Oracle到PostgreSQL的查询转换

我在Oracle中有以下查询:

SELECT to_number(a.v_VALUE), b.v_VALUE
       FROM TABLE(inv_fn_splitondelimiter('12;5;25;10',';')) a
       JOIN TABLE(inv_fn_splitondelimiter('10;20;;', ';')) b
         ON a.v_idx = b.v_idx
Run Code Online (Sandbox Code Playgroud)

这给我的结果如下:

在此输入图像描述

我想将查询转换为Postgres.我尝试过如下查询:

SELECT UNNEST(String_To_Array('10;20;',';'))
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

SELECT a,b
       FROM (select  UNNEST(String_To_Array('12;5;25;10;2',';'))) a
       LEFT JOIN (select  UNNEST(String_To_Array('12;5;25;10',';'))) b
         ON a = b
Run Code Online (Sandbox Code Playgroud)

但没有得到正确的结果.
我不知道如何编写完全等同于Oracle版本的查询.任何人?

sql oracle postgresql unnest set-returning-functions

3
推荐指数
1
解决办法
1364
查看次数

返回列名和不同的值

假设我在 postgres 中有一个简单的表,如下所示:

+--------+--------+----------+
|  Car   |  Pet   |   Name   |
+--------+--------+----------+
| BMW    |  Dog   |   Sam    |
| Honda  |  Cat   |   Mary   |
| Toyota |  Dog   |   Sam    |
| ...    |  ...   |   ...    |
Run Code Online (Sandbox Code Playgroud)

我想运行一个 sql 查询,该查询可以返回第一列中的列名和第二列中的唯一值。例如:

+--------+--------+
|  Col   |  Vals  |
+--------+--------+
| Car    |  BMW   |
| Car    | Toyota |
| Car    | Honda  |
| Pet    |  Dog   |
| Pet    |  Cat   |
| Name   |  Sam   | …
Run Code Online (Sandbox Code Playgroud)

sql postgresql distinct set-returning-functions

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

如何在 Postgres 中取消嵌套日期数组?

我想在下表中插入,但我无法转换日期数组。

CREATE TABLE schedule (
  idschedule serial NOT NULL,
  idzone integer NOT NULL,
  "time" timestamp without time zone NOT NULL,
  automatic boolean NOT NULL,
  idrecurrence character varying(20),
  duration integer,
  date date,
)
Run Code Online (Sandbox Code Playgroud)

INSERT我试图执行:

INSERT INTO schedule(idzone, "date", "time", duration, automatic) 
SELECT x, y, '20:00:00', '20', 'FALSE' 
FROM   unnest(ARRAY[3,4,5]) x
     , unnest(ARRAY[2015-4-12, 2015-4-19, 2015-4-26]) y
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

错误:列“日期”的类型为日期但表达式的类型为整数

arrays postgresql integer date unnest

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

如何正确解除两个数组的嵌套

我有两个数组:函数内的 foo_array text[]、bar_array text[] 。它们每个都包含字符串,这些字符串将使用“string_to_array”函数拆分为数组元素,并将类型转换为 bigint。

我想在表中返回这些数组(out1 bigint,out2 bigint)。

例如,foo_array 和 bar_array 每个包含 10 个元素,我希望该函数返回包含这些元素的 10 行。我只能产生 20 个元素的输出,并且不太理解它。

CREATE OR REPLACE FUNCTION ___two_unnests()
RETURNS TABLE(out1 bigint, out2 bigint) AS $$
DECLARE
    foo_array text[];
    bar_array text[];

    foo1 text := array_to_string(ARRAY[1, 2, 3, 4, 5], ',');
    foo2 text := array_to_string(ARRAY[11, 22, 33, 44, 55], ',');

    bar1 text := array_to_string(ARRAY[6, 7, 8, 9, 10], ',');
    bar2 text := array_to_string(ARRAY[66, 77, 88, 99, 1010], ',');
BEGIN
    foo_array := (SELECT foo_array || foo1 || …
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql

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

Postgres array_position(array, element) 有时是 0 索引?

Postgres 方法array_position(array, element)与 SQL 中的其他事物一样,是基于 1 的。例如:

SELECT array_position(array[4,5,6], 5)    -- returns 2
Run Code Online (Sandbox Code Playgroud)

但是,我正在执行以下查询来从 pg_catalog 检索非唯一索引及其列:

SELECT array_position(array[4,5,6], 5)    -- returns 2
Run Code Online (Sandbox Code Playgroud)

第四个选择indkey在数组中搜索列的ordinal_position,因此对于每一列,它都会获取其在索引中的位置。

有趣的是,第一列的位置为 0,所以我必须添加+ 1它以使其基于 1。

随后的CASE表达式使用完全相同的值作为检索 的第 n 个元素的索引indoption,奇怪的是,即使[]运算符也是基于 1 的,也能正常工作:

SELECT (array[4,5,6])[2]    -- returns 5
Run Code Online (Sandbox Code Playgroud)

这怎么样?

我目前使用的是 PG 9.6。

sql postgresql indexing ddl

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