我在PostgreSQL中有两个相同长度的数组值:
{a,b,c} 和 {d,e,f}
我想把它们结合起来
{{a,d},{b,e},{c,f}}
有没有办法做到这一点?
我有一个表模式,其中包含一个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) 我明白使用
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
我想在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)
只插入一行.
如何修改我的函数以一次插入多行?
我试图通过两个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 …
这是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) 我在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版本的查询.任何人?
假设我在 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) 我想在下表中插入,但我无法转换日期数组。
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)
我收到以下错误:
错误:列“日期”的类型为日期但表达式的类型为整数
我有两个数组:函数内的 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) 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。