我在文档中找不到这个问题的明确答案.如果列是数组类型,是否会对所有输入的值进行单独索引?
我创建了一个包含一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)
索引是否有助于此查询?
查询如下:
SELECT i_adgroup_id, i_category_id
FROM adgroupcategories_br
WHERE i_adgroup_id IN
(
SELECT i_adgroup_id
FROM adgroupusers_br
WHERE i_user_id = 103713
)
GROUP BY i_adgroup_id, i_category_id;
Run Code Online (Sandbox Code Playgroud)
给我这样的结果:
i_adgroup_id integer | i_category_id smallint
---------------------|-----------------------
15938 | 2
15938 | 3
15938 | 4
15942 | 1
15942 | 2
Run Code Online (Sandbox Code Playgroud)
我想要的是这样的结果:
i_adgroup_id integer | i_category_id smallint[]
---------------------|-----------------------
15938 | { 2, 3, 4 }
15942 | { 1, 2 }
Run Code Online (Sandbox Code Playgroud)
如何更改原始SQL查询以获得上述结果?
我正在尝试根据另一列的值来排序某些不同聚合文本的输出顺序,例如:
string_agg(DISTINCT sometext, ' ' ORDER BY numval)
Run Code Online (Sandbox Code Playgroud)
但是,这会导致错误:
错误:在与DISTINCT聚合时,ORDER BY表达式必须出现在参数列表中
我确实理解为什么会这样,因为如果numval
两个重复值中的顺序不同,则排序将是"不明确的" ,而另一个重复值之间的排序将是"不明确的" .
理想情况下,我想按照第一次出现/最低顺序排序它们,但是在我的数据中,不明确的情况实际上是非常罕见的(它主要是顺序重复的值,我想用它除去DISTINCT
)我最终不要特别关心他们的订购,并且会对像MySQL这样的东西感到满意,GROUP_CONCAT(DISTINCT sometext ORDER BY numval SEPARATOR ' ')
尽管它很邋..
我希望Postgres的一些扭曲是必要的,但我真的不知道最有效/简洁的方法是什么.
我最近不得不编写一个查询来过滤一些如下所示的特定数据:
假设我有3个不同的值,我想在我的数据库中的一个表的3个不同字段中搜索,它们必须以所有可能的顺序搜索而不重复.
下面是一个示例(为了便于理解,我将使用命名查询表示法来显示必须放置值的位置):
val1 ="a",val2 ="b",val3 ="c"
这是我生成的查询:
SELECT * FROM table WHERE
(fieldA = :val1 AND fieldB = :val2 AND fieldC = :val3) OR
(fieldA = :val1 AND fieldB = :val3 AND fieldC = :val2) OR
(fieldA = :val2 AND fieldB = :val1 AND fieldC = :val3) OR
(fieldA = :val2 AND fieldB = :val3 AND fieldC = :val1) OR
(fieldA = :val3 AND fieldB = :val1 AND fieldC = :val2) OR
(fieldA = :val3 AND fieldB = :val2 …
Run Code Online (Sandbox Code Playgroud) 这是我(也许通常适合你)的非优化解决方案:
使用非优化内部函数的PG问题的解决方法:
CREATE FUNCTION unnest_with_idx(anyarray)
RETURNS TABLE(idx integer, val anyelement) AS
$$
SELECT generate_series(1,array_upper($1,1)) as idx, unnest($1) as val;
$$ LANGUAGE SQL IMMUTABLE;
Run Code Online (Sandbox Code Playgroud)
测试:
SELECT idx,val from unnest_with_idx(array[1,20,3,5]) as t;
Run Code Online (Sandbox Code Playgroud)
但是,正如我所说,非优化.我不敢相信(!!)PostgreSQL没有数组的内部索引......?但在这种情况下,问题是如何直接访问这个GIN类内部计数器的指数?
注1:上面的解决方案和问题与" 如何通过数组的每个元素创建索引? "不同.也可以与" Can PostgreSQL索引数组列? "不同,因为该函数用于隔离数组,而不是用于数组字段的表索引.
NOTE2(在答案后编辑):"数组索引"(更常用的术语)或"数组下标"或"数组计数器"是我们可以在语义路径中使用的术语,用于将"内部计数器",累加器引用到下一个数组项目.我看到没有PostgreSQL命令提供对此计数器的直接访问.作为generate_series()
函数,generate_subscripts()
函数是序列生成器,并且性能(最好但是)接近相同.通过其他手工row_number()
功能提供了对"内部行计数器"的直接访问,但它是关于行,而不是关于数组,不幸的是性能更差.
postgresql ×5
arrays ×3
sql ×3
indexing ×2
distinct ×1
mariadb ×1
mysql ×1
permutation ×1
sql-order-by ×1