标签: array

如何将 JSON 数组转换为 Postgres 数组?

我有一个data类型的列,json其中包含这样的 JSON 文档:

{
    "name": "foo",
    "tags": ["foo", "bar"]
}
Run Code Online (Sandbox Code Playgroud)

我想将嵌套tags数组转换为连接字符串 ( 'foo, bar')。array_to_string()从理论上讲,使用该函数很容易做到这一点。但是,此功能不接受json输入。所以我想知道如何将这个 JSON 数组变成 Postgres 数组(类型text[])?

postgresql array postgresql-9.3 json

97
推荐指数
4
解决办法
28万
查看次数

数组成员的外键约束?

假设我有一个包含工作角色的表:

CREATE TABLE roles
(
  "role" character varying(80) NOT NULL,
  CONSTRAINT "role" PRIMARY KEY (role)
);
Run Code Online (Sandbox Code Playgroud)

假设我还有一个表、用户,并且每一行(一个特定用户)可以有任意数量的工作角色:

CREATE TABLE users
(
  username character varying(12) NOT NULL,
  roles character varying(80)[] NOT NULL,
  CONSTRAINT username PRIMARY KEY (username)
);
Run Code Online (Sandbox Code Playgroud)

我应该确保每个成员都users.roles[]存在于roles.role 中。在我看来,我想要的是对每个成员的外键约束users.roles[],如果引用了roles.role。

这对于 postgres 似乎是不可能的。我是不是看错了?处理此问题的建议“正确”方法是什么?

postgresql referential-integrity array

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

针对多个值的 PostgreSQL JSON 查询数组

我想针对jsonbPostgres中的类型编写一个查询,给定一组客户 ID 将找到相应的组。

鉴于此示例表:

CREATE TABLE grp(d JSONB NOT NULL);

INSERT INTO grp VALUES
   ('{"name":"First","arr":["foo"], "customers":[{"id":"1", "name":"one"},{"id":"2", "name":"two"}]}')
 , ('{"name":"Second","arr":["foo","bar"], "customers":[{"id":"3", "name":"three"},{"id":"4", "name":"four"}]}')
 , ('{"name":"Third","arr":["bar","baz"], "customers":[{"id":"5", "name":"five"},{"id":"6", "name":"seven"}]}');
Run Code Online (Sandbox Code Playgroud)

我发现了类似的问题(针对多个值的 PostgreSql JSONB SELECT)并设法使用此查询在简单数组上实现了我想要的:

SELECT d FROM grp WHERE d->'arr' ?| ARRAY['foo', 'bar'];
Run Code Online (Sandbox Code Playgroud)

但是,当数组包含 JSON对象时,我无法使其工作:

SELECT d FROM grp WHERE d->'customers' ?| ARRAY['{"id":"1"}', '{"id":"5"}'];
Run Code Online (Sandbox Code Playgroud)

这是我对查询的期望:

grp“第一个”-> 客户“1”

grp "第三" -> 客户 "5"

postgresql array json postgresql-9.4

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

将多对多连接的右侧转换为数组

在多对多关系上使用 join 时,结果会拆分为多行。我想做的是将连接的右侧转换为数组,因此结果是一行。

包含 3 个表的示例:

CREATE TABLE items (
  id    serial primary key,
  title text
);

CREATE TABLE tags (
  id    serial primary key,
  title text
);

CREATE TABLE items_tags (
  item_id int references items(id),
  tag_id  int references tags(id),
  primary key (item_id, tag_id)
);
Run Code Online (Sandbox Code Playgroud)

选择带有标签的项目时,我可以这样做:

SELECT i.id, i.title, i.title
FROM items i
INNER JOIN items_tags it
ON it.item_id = i.id
INNER JOIN tags t
ON t.id = it.tag_id;
Run Code Online (Sandbox Code Playgroud)

结果将显示为:

(1, "item n1", "sport")
(1, "item n1", "soccer")
(2, "item …
Run Code Online (Sandbox Code Playgroud)

postgresql aggregate array postgresql-9.4

26
推荐指数
2
解决办法
3万
查看次数

如何保留未嵌套数组中元素的原始顺序?

鉴于字符串:

'我认为 PostgreSQL 很漂亮'

我想对该字符串中找到的单个单词进行操作。本质上,我有一个单独的,我可以从中获取单词详细信息,并希望在此字典上加入该字符串的未嵌套数组。

到目前为止,我有:

select word, meaning, partofspeech
from unnest(string_to_array('I think that PostgreSQL is nifty',' ')) as word
from table t
join dictionary d
on t.word = d.wordname;
Run Code Online (Sandbox Code Playgroud)

这完成了我希望做的事情的基本原理,但它没有保留原始的词序。

相关问题:
PostgreSQL unnest() with element number

postgresql parse sorting array

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

如何从 PostgreSQL 中的 jsonb 数组中获取特定对象?

我有一个名为“user”的字段,其中包含一个大致如下所示的 json 数组:

"user"

[{ "_id" : "1", "count" : "4" }, { "_id" : "3", "count": "4"}]
Run Code Online (Sandbox Code Playgroud)

现在我想要一个像这样的查询:

select count from tablename where id = "1"
Run Code Online (Sandbox Code Playgroud)

我无法count从 PostgreSQL 9.4 中的 json 对象数组中获取特定字段。

postgresql array json postgresql-9.4

21
推荐指数
1
解决办法
7万
查看次数

何时在 postgres 中使用 JSON 或 JSONB 数组与 SQL 数组

我正在寻找在 JSON 或 JSONB 数组与常规 SQL postgres 数组之间进行选择时要考虑的要点。如果您知道只会将一种数据类型插入数组中,为什么要使用 SQL 数组而不是 JSON 数组?谢谢

postgresql database-design array

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

将数组或记录传递给 PostgreSQL 中的函数?

我有一项任务是将数组、记录以及在某些情况下的记录数组作为参数传递给 PostgreSQL 中的函数。

postgresql functions array postgresql-9.0 composite-types

17
推荐指数
1
解决办法
4万
查看次数

为什么 array_agg() 比非聚合 ARRAY() 构造函数慢?

我刚刚查看了一些为8.4 之前的 PostgreSQL编写的旧代码,我看到了一些非常棒的东西。我记得以前有一个自定义函数可以做一些这样的事情,但我忘记了预先的array_agg()样子。回顾一下,现代聚合是这样写的。

SELECT array_agg(x ORDER BY x DESC) FROM foobar;
Run Code Online (Sandbox Code Playgroud)

然而,曾几何时,它是这样写的,

SELECT ARRAY(SELECT x FROM foobar ORDER BY x DESC);
Run Code Online (Sandbox Code Playgroud)

所以,我用一些测试数据试了一下..

CREATE TEMP TABLE foobar AS
SELECT * FROM generate_series(1,1e7)
  AS t(x);
Run Code Online (Sandbox Code Playgroud)

结果令人惊讶..#OldSchoolCool 方式要快得多:加速了 25%。此外,在没有ORDER 的情况下简化它,表现出同样的缓慢。

# EXPLAIN ANALYZE SELECT ARRAY(SELECT x FROM foobar);
                                                         QUERY PLAN                                                          
-----------------------------------------------------------------------------------------------------------------------------
 Result  (cost=104425.28..104425.29 rows=1 width=0) (actual time=1665.948..1665.949 rows=1 loops=1)
   InitPlan 1 (returns $0)
     ->  Seq Scan on foobar  (cost=0.00..104425.28 rows=6017728 width=32) (actual time=0.032..716.793 rows=10000000 loops=1) …
Run Code Online (Sandbox Code Playgroud)

postgresql benchmark aggregate array

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

为什么 PostgreSQL 允许查询 array[0] 即使它使用基于 1 的数组?

我一直在我的一个 PostgreSQL 数据库中使用数组。

我创建了一个包含至少一个元素的几何数组的表:

CREATE TABLE test_arrays (
    polygons geometry(Polygon,4326)[],
    CONSTRAINT non_empty_polygons_chk 
        CHECK ((COALESCE(array_length(polygons, 1), 0) <> 0))
);
Run Code Online (Sandbox Code Playgroud)

我添加了几行,并在表中查询每个几何数组中的第一个元素:

SELECT polygons[0] FROM test_arrays;
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,我得到了一个空行列表!

经过一些研究,事实证明PostgreSQL 数组是基于一个的

数组下标数字写在方括号内。默认情况下,PostgreSQL 使用基于 1 的数组编号约定,即 n 个元素的数组以 array[1] 开头,以 array[n] 结尾。

所以SELECT polygons[0] FROM test_arrays;工作并返回polygon每一行的第一行。

如果 PostgreSQL 使用基于 1 的编号约定,为什么允许查询第 0 个元素,结果是否有任何意义?

postgresql array postgresql-9.3

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