相关疑难解决方法(0)

PostgreSQL可以索引数组列吗?

我在文档中找不到这个问题的明确答案.如果列是数组类型,是否会对所有输入的值进行单独索引?

我创建了一个包含一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)

索引是否有助于此查询?

arrays postgresql indexing

132
推荐指数
3
解决办法
7万
查看次数

PostgresQL SQL:将结果转换为数组

查询如下:

    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查询以获得上述结果?

sql arrays postgresql

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

通过聚合函数中其他列的(第一个值)排序不同的列值

我正在尝试根据另一列的值来排序某些不同聚合文本的输出顺序,例如:

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的一些扭曲是必要的,但我真的不知道最有效/简洁的方法是什么.

sql postgresql distinct sql-order-by aggregate-functions

11
推荐指数
3
解决办法
5840
查看次数

SQL查询,用于将值列表与任何顺序的字段列表进行匹配,而不重复

我最近不得不编写一个查询来过滤一些如下所示的特定数据:

假设我有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)

mysql sql postgresql permutation mariadb

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

如何使用postgreSQL访问数组内部索引?

这是我(也许通常适合你)的非优化解决方案:

使用非优化内部函数的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()功能提供了对"内部行计数器"的直接访问,但它是关于行,而不是关于数组,不幸的是性能更差.

arrays postgresql indexing

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