【问题标题】:Query table by indexes from integer array通过整数数组中的索引查询表
【发布时间】:2012-12-19 18:03:00
【问题描述】:

在我从 VB.NET 转换数据“to_timestamp”和“to_number”获得出色结果后,我想知道 PostgreSQL 是否有可能通过 .NET 的整数数组查询表索引?

说,我有一个充满(1, 3, 5, 6, 9) 的数组。 PostgreSQL 是否有可能将包含这些索引中的数据的行返回到“odbc.reader”?
这比像我现在这样循环和查询 5 次要快得多。

类似这样的:

SELECT myindexes, myname, myadress from mytable WHERE myindexes IS IN ARRAY 

如果可能的话,一个简单的查询应该是什么样子?

【问题讨论】:

    标签: sql arrays postgresql


    【解决方案1】:

    这是可能的。

    任何

    SELECT myindex, myname, myadress
    FROM   mytable
    WHERE  myindex = ANY ($my_array)
    

    整数数组示例:

    ...
    WHERE  myindex = ANY ('{1,3,5,6,9}'::int[])
    

    Details about ANY in the manual.

    还有用于相同目的的 SQL IN() expression
    PostgreSQl 在其当前实现中在执行之前将其内部转换为= ANY (array),因此可以想象它会慢一些。


    加入 long 列表的示例(根据评论):

    JOIN 到 VALUES 表达式

    WITH x(myindex) AS (
        VALUES
        (1),(3),(5),(6),(9)
        )
    SELECT myindex, myname, myadress
    FROM   mytable
    JOIN   x USING (myindex)
    

    我在示例中使用CTE(这是可选的,也可以是子查询)。为此,您需要 PostgreSQL 8.4 或更高版本。
    The manual about VALUES.

    加入非嵌套数组

    或者你可以unnest()一个数组和JOIN它:

    SELECT myindex, myname, myadress
    FROM   mytable
    JOIN  (SELECT unnest('{1,3,5,6,9}'::int[]) AS myindex) x USING (myindex)
    

    这些方法中的每一个在性能上都远优于对每个值运行单独的查询。

    【讨论】:

    • 非常感谢。这可能意味着我应该将我的数组“写入”到带有逗号的字符串,以便能够将其放入查询中。但我没有在手册中找到该数组可以以字节或元素为单位多长时间?
    • @user973238:数组的长度几乎没有限制。
    • 这意味着查询字符串的长度没有限制。关于您的经验,如果数组有几千个元素,这个函数是否可以快速接受?
    • @user973238:速度非常快。性能是否可接受由您决定。对于巨大的列表,如果创建临时表和JOIN 可能会更快,或者使用VALUES 表达式用于相同目的。使用EXPLAIN ANALYZE 测试性能。我将在我的答案中添加一个示例查询。
    • 非常感谢!我会试试的。
    猜你喜欢
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 2018-02-16
    • 2018-05-02
    相关资源
    最近更新 更多