标签: array

如何在 Postgresql 中转换为 int 数组?

我想从 ARGV[] 转换到 PostgreSQL 中的 int 数组,我在代码中用TODO标记了伪代码。x86_64-unknown-linux-gnu 上 PostgreSQL 9.4.3 中的代码,由 gcc (Debian 4.9.2-10) 4.9.2 编译,64 位:

CREATE TABLE measurements (
        measurement_id SERIAL PRIMARY KEY NOT NULL,
        measurement_size_in_bytes INTEGER NOT NULL
);

CREATE TABLE events (
        event_id SERIAL PRIMARY KEY NOT NULL, 
        measurement_id INTEGER NOT NULL, 
        event_index_start INTEGER NOT NULL,
        event_index_end INTEGER NOT NULL
);

CREATE OR REPLACE FUNCTION insaft_function() 
    RETURNS TRIGGER AS 
$func$
BEGIN 
  -- TODO Loop until TG_ARGV[0] empty
INSERT INTO events (measurement_id, event_index_start, event_index_end) 
SELECT …
Run Code Online (Sandbox Code Playgroud)

postgresql insert plpgsql cast array

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

查找整数序列包含给定子序列的行

问题

注意:我指的是数学序列,而不是PostgreSQL序列机制

我有一个表示整数序列的表。定义是:

CREATE TABLE sequences
(
  id serial NOT NULL,
  title character varying(255) NOT NULL,
  date date NOT NULL,
  sequence integer[] NOT NULL,
  CONSTRAINT "PRIM_KEY_SEQUENCES" PRIMARY KEY (id)
);
Run Code Online (Sandbox Code Playgroud)

我的目标是使用给定的子序列查找行。也就是说,sequence字段是包含给定子序列的序列的行(在我的情况下,序列是有序的)。

例子

假设该表包含以下数据:

+----+-------+------------+-------------------------------+
| id | title |    date    |           sequence            |
+----+-------+------------+-------------------------------+
|  1 | BG703 | 2004-12-24 | {1,3,17,25,377,424,242,1234}  |
|  2 | BG256 | 2005-05-11 | {5,7,12,742,225,547,2142,223} |
|  3 | BD404 | 2004-10-13 | {3,4,12,5698,526}             |
| …
Run Code Online (Sandbox Code Playgroud)

schema postgresql performance array

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

在单个查询中从一对多关系数据构建 JSON 对象?

我有一个带有如下表的 PostgreSQL 9.5.3 DB:

container
    id: uuid (pk)
    ... other data

thing
    id: uuid (pk)
    ... other data

container_thing
    container_id: uuid (fk)
    thing_id: uuid (fk)
    primary key (container_id, thing_id)
Run Code Online (Sandbox Code Playgroud)

Acontainer可以指向任意数量的things(没有重复),并且 athing可以被任意数量的containers指向。

可能有大量的容器和东西(取决于我们有多少客户)。每个容器中可能只有 1 到 10 个东西。我们一次最多只能查询大约 20 个容器。一个容器可以是空的,我需要取回一个空数组。

我需要构建代表容器的 json 对象,如下所示:

{
    "id": "d7e1bc6b-b659-432d-b346-29f3a530bfa9",
    ... other data
    "thingIds": [
        "4e3ad81b-f2b5-4220-8e0e-e9d53c80a214",
        "f26f49e5-76b4-4363-9ffe-9654ba0b0f0d"
    ]
}
Run Code Online (Sandbox Code Playgroud)

这工作正常,但我通过使用两个查询来做到这一点:

select * from "container" where "id" in (<list of container ids>)
select * from "container_thing" where "container_id" in …
Run Code Online (Sandbox Code Playgroud)

postgresql join array json many-to-many

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

验证 json[] 数组不为空的最快方法是什么?

我想验证一json[]the_array不为空。对于普通数组,我可以检查:

the_array != '{}'
Run Code Online (Sandbox Code Playgroud)

但是,这不适用于 a json[],如下所示:

select '{}'::json[] != '{}'
ERROR:  could not identify an equality operator for type json
Run Code Online (Sandbox Code Playgroud)

我可以改用以下检查:

array_length(the_array, 1) != null // yes, array_length on an
                                      empty array returns null
Run Code Online (Sandbox Code Playgroud)

我担心这array_length()会遍历整个数组以计算项目数,然后返回该计数。就我而言,我不需要数组的实际大小,我只需要知道它是否为空。

那么,是否array_length()遍历整个数组?如果是这样,是否有更好的方法来检查 json 数组是否为空?

postgresql array json

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

如何将带有数组字段的表类型传递给 postgresql 中的函数

我有一张桌子叫书

CREATE TABLE book
(
  id smallint NOT NULL DEFAULT 0,       
  bname text,       
  btype text,
  bprices numeric(11,2)[],
  CONSTRAINT key PRIMARY KEY (id )
)
Run Code Online (Sandbox Code Playgroud)

和一个函数 save_book

CREATE OR REPLACE FUNCTION save_book(thebook book)
  RETURNS text AS
$BODY$
DECLARE 
myoutput text :='Nothing has occured';
BEGIN

    update book set 
    bname=thebook.bname,
    btype=thebook.btype,bprices=thebook.bprices  WHERE id=thebook.id;

    IF FOUND THEN
        myoutput:= 'Record with PK[' || thebook.id || '] successfully updated';
        RETURN myoutput;
    END IF;

    BEGIN
        INSERT INTO book values(thebook.id,thebook.bname,thebook.btype,
        thebook.bprices);
        myoutput:= 'Record successfully added';           
    END;
 RETURN myoutput; …
Run Code Online (Sandbox Code Playgroud)

postgresql datatypes functions postgresql-9.1 array

8
推荐指数
2
解决办法
9762
查看次数

PostgreSQL中获取两个文本数组交集长度的最快方法

这是我目前正在使用的:

CREATE FUNCTION array_intersect(a1 anyarray, a2 anyarray)
RETURNS anyarray AS
$$ 
  SELECT ARRAY(
    SELECT unnest($1)
    INTERSECT SELECT unnest($2)
    ORDER BY 1
  );
$$ LANGUAGE sql
IMMUTABLE STRICT;


--get the length:
select array_length ( array_intersect(array[...], array[...]), 1);
Run Code Online (Sandbox Code Playgroud)

有没有更快的方法?

postgresql performance array postgresql-9.3

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

将多个数组取消嵌套到行中

我已经看到了使用此示例进行批量插入的好方法

WITH p AS (
    INSERT INTO parent_table (column_1) 
    SELECT $1 
    RETURNING id) 
INSERT INTO child_table (parent_table_id, column_a) 
SELECT p.id, a 
FROM   p, unnest($2::text[]) AS a
Run Code Online (Sandbox Code Playgroud)

但是,我需要从多个数组中插入多行,所以我尝试了以下语法:

WITH p AS (
    INSERT INTO parent_table (column_1) 
    SELECT $1 
    RETURNING id) 
INSERT INTO child_table (parent_table_id, column_a, column_b) 
SELECT p.id, a, b 
FROM   p, unnest($2::text[]) AS a, unnest($3::bigint[]) AS b
Run Code Online (Sandbox Code Playgroud)

我在parent_table_idand上有一个主键column_a,当我尝试执行此查询时,Postgres 抱怨重复键冲突。

应该如何解开数组以便它们形成单独的行?

换句话说,如果$2$3都有两个条目,那么第一个条目如何$2只插入第一个条目,$3并且对于各自的第二个条目都相同?

如果这是不可能的,我可以构造一个多维数组吗?如果是这样,它应该如何与多种数组类型一起传递,多维数组语法是什么?

postgresql array set-returning-functions bulk-insert

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

如何从 PostgreSQL 中的 JSON[] 数组中删除已知元素?

我遇到了在 PostgreSQL 中使用 JSON 数据类型的问题。我尝试实现在数据库中存储非规范化的 Java 模型。该模型具有复杂对象列表。因此,我决定将它们建模为原生 PostgreSQL 数组中的 JSON。

这是我的表创建语句的精简片段:

CREATE TABLE test.persons
(
  id UUID,
  firstName TEXT,
  lastName TEXT,
  communicationData JSON[],
  CONSTRAINT pk_person PRIMARY KEY (id)
);
Run Code Online (Sandbox Code Playgroud)

如您所见,它是一个以 JSON 格式显示通信数据对象列表的人。其中一个对象可能如下所示:

{"value" : "03334/254147", "typeId" : "ea4e7d7e-7b87-4628-ba50-6a5f6e63dbf6"}
Run Code Online (Sandbox Code Playgroud)

我可以使用 PostgreSQL 的 array_append 轻松地将这样的 JSON 对象附加到数组中。但是,我无法从数组中删除已知值。考虑一下这个 SQL 语句:

UPDATE test.persons
SET communicationData = array_remove(
      communicationData, 
      '{"value" : "03334/254147", "typeId" : "ea4e7d7e-7b87-4628-ba50-6a5f6e63dbf6"}'::JSON
    )
WHERE id = 'f671eb6a-d603-11e3-bf6f-07ba007d953d';
Run Code Online (Sandbox Code Playgroud)

这失败了ERROR: could not identify an equality operator for type json。您是否有提示我如何从 JSON 数组中删除已知值?也可以按数组中的位置删除,因为我知道一个也......

PostgreSQL …

postgresql update array json

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

Postgres 查询以将 JSON 对象键作为数组返回

是否可以将 JSON 对象键作为 PostgreSQL 中的值数组返回?

在 JavaScript 中,这只是Object.keys(obj),它返回一个字符串数组。

例如,如果我有一张这样的表:

tbl_items
---------
id bigserial NOT NULL
obj json NOT NULL
Run Code Online (Sandbox Code Playgroud)

如果有这样的一行:

id      obj
-----   -------------------------
123     '{"foo":1,"bar":2}'
Run Code Online (Sandbox Code Playgroud)

我怎样才能有一个查询返回:

id      keys
-----   ------------------
123     '{"foo","bar"}'
Run Code Online (Sandbox Code Playgroud)

postgresql array json postgresql-9.4

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

如何在分隔符之后生成所有尾随子字符串?

给定一个可能包含多个分隔符实例的字符串,我想生成从该字符开始的所有子字符串。

例如,给定一个像'a.b.c.d.e'(或 array {a,b,c,d,e},我想)这样的字符串,我想生成一个像这样的数组:

{a.b.c.d.e, b.c.d.e, c.d.e, d.e, e}
Run Code Online (Sandbox Code Playgroud)

预期用途是作为填充一列的触发器,以便在写入另一列时更容易地查询域名部分(即,查找全部q.x.t.com以进行查询t.com)。

解决这个问题似乎是一种笨拙的方法(而且很可能是),但现在我很好奇如何用(Postgres')SQL 编写这样的函数。

这些是电子邮件域名,因此很难说元素的最大可能数量是多少,但绝大多数肯定会小于 5。

postgresql pattern-matching array

8
推荐指数
2
解决办法
1100
查看次数