我在文档中找不到这个问题的明确答案.如果列是数组类型,是否会对所有输入的值进行单独索引?
我创建了一个包含一int[]列的简单表,并在其上放置了一个唯一索引.我注意到我无法添加相同的整数数组,这使我相信索引是数组项的组合,而不是每个项的索引.
INSERT INTO "Test"."Test" VALUES ('{10, 15, 20}');
INSERT INTO "Test"."Test" VALUES ('{10, 20, 30}');
SELECT * FROM "Test"."Test" WHERE 20 = ANY ("Column1");
Run Code Online (Sandbox Code Playgroud)
索引是否有助于此查询?
当我有一个具有分隔值的列时,我可以使用该unnest()函数:
myTable
id | elements
---+------------
1 |ab,cd,efg,hi
2 |jk,lm,no,pq
3 |rstuv,wxyz
select id, unnest(string_to_array(elements, ',')) AS elem
from myTable
id | elem
---+-----
1 | ab
1 | cd
1 | efg
1 | hi
2 | jk
...
Run Code Online (Sandbox Code Playgroud)
我如何包含元素编号?即:
id | elem | nr
---+------+---
1 | ab | 1
1 | cd | 2
1 | efg | 3
1 | hi | 4
2 | jk | 1
...
Run Code Online (Sandbox Code Playgroud)
我想要源字符串中每个元素的原始位置.我试着窗口函数(row_number(), …
sql arrays postgresql window-functions set-returning-functions
PostgreSQL可以在任何地方开始使用数组下标.
考虑这个创建一个包含3个元素的数组的示例,其中包含5到7的下标:
SELECT ('[5:7]={1,2,3}'::int[]);
Run Code Online (Sandbox Code Playgroud)
返回:
[5:7]={1,2,3}
Run Code Online (Sandbox Code Playgroud)
例如,你得到第一个元素的含义
SELECT ('[5:7]={1,2,3}'::int[])[5];
Run Code Online (Sandbox Code Playgroud)
我想规范化 任何给定的1维数组以从数组下标1开始.
我能想到的最好的:
SELECT ('[5:7]={1,2,3}'::int[])[array_lower('[5:7]={1,2,3}'::int[], 1):array_upper('[5:7]={1,2,3}'::int[], 1)]
Run Code Online (Sandbox Code Playgroud)
或者,同样,更容易阅读:
WITH x(a) AS (
SELECT '[5:7]={1,2,3}'::int[]
)
SELECT a[array_lower(a, 1):array_upper(a, 1)]
FROM x
Run Code Online (Sandbox Code Playgroud)
你知道更简单/更快或更优雅的方式吗?
为了测试性能,我提出了这个快速基准测试.
表有100k行,随机长度在1和11之间的简单整数数组:
CREATE TEMP TABLE t (a int[]);
INSERT INTO t -- now with actually varying subscripts
SELECT ('[' || g%10 || ':' || 2*(g%10) || ']={1'
|| repeat(','||g::text, g%10) || '}')::int[]
FROM generate_series(1,100000) g;
EXPLAIN ANALYZE
SELECT
substring(a::text, '{.*$')::int[] -- Total runtime: 949.304 …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
使用此架构:
create table object (
obj_id serial primary key,
name varchar(80) not null unique,
description text,
tag_arr int[]
);
create table tag (
tag_id serial primary key,
label varchar(20) not null unique
);
Run Code Online (Sandbox Code Playgroud)
一个对象可以附加任意数量的标签。object X tag我希望将tag_ids保留在一个数组中,而不是一个表,以便可以轻松地使用对象记录获取它们。
如何创建索引object以便每个元素tar_arr都是一个索引?
也就是说,有没有更好的方法来解决这个问题?
这可以通过以下方式实现:
create table obj_x_tag(
obj_id references object,
tag_id references tag,
constraint obj_x_tag_pk primary key( obj_id, tag_id )
);
select obj_id, name, description, array_agg( tag_id )
from object o
join obj_x_tag x using( obj_id …Run Code Online (Sandbox Code Playgroud)