【问题标题】:Find value in array (Postgresql)在数组中查找值(Postgresql)
【发布时间】:2019-02-11 20:02:14
【问题描述】:

以下返回“{3130,3135,2179,3186}”,输入“INTEGER[]”:

SELECT
array_agg(c) AS c
FROM
(
SELECT 3130::INTEGER AS c
UNION
SELECT 3135::INTEGER AS c
UNION
SELECT 2179::INTEGER AS c
UNION
SELECT 3186::INTEGER AS c
) AS v

如果我尝试通过直接将文本转换为整数数组来查找数字“3186”,它就可以正常工作:

SELECT 3186::INTEGER = ANY
(
'{3130,3135,2179,3186}'::INTEGER[]
)

但如果我尝试对第一个查询的结果执行相同操作,我会收到“operator does not exist: integer = integer[]”错误消息:

SELECT 3186::INTEGER = ANY
(
    SELECT
    array_agg(c) AS c
    FROM
    (
    SELECT 3130::INTEGER AS c
    UNION
    SELECT 3135::INTEGER AS c
    UNION
    SELECT 2179::INTEGER AS c
    UNION
    SELECT 3186::INTEGER AS c
    ) AS v
)

我做错了什么?

我正在使用 PostgreSQL 9.5.3,PgAdmin 1.22.1

【问题讨论】:

    标签: sql arrays postgresql select


    【解决方案1】:

    ANY() 有两种形式。在您的查询中,它们是混合的。

    如果你想使用ANY (array expression):

    SELECT 3130 = ANY(
        ARRAY(
            SELECT 3130::INTEGER AS c
            UNION
            SELECT 3135::INTEGER AS c
            UNION
            SELECT 2179::INTEGER AS c
            UNION
            SELECT 3186::INTEGER AS c
        ) 
    )
    

    SELECT 3130 = ANY(array_agg(c))
    FROM (
        SELECT 3130::INTEGER AS c
        UNION
        SELECT 3135::INTEGER AS c
        UNION
        SELECT 2179::INTEGER AS c
        UNION
        SELECT 3186::INTEGER AS c
        ) alias
    

    如果你想使用ANY (subquery):

    SELECT 3130 = ANY(
        SELECT 3130::INTEGER AS c
        UNION
        SELECT 3135::INTEGER AS c
        UNION
        SELECT 2179::INTEGER AS c
        UNION
        SELECT 3186::INTEGER AS c
    )
    

    【讨论】:

      【解决方案2】:

      您可以显式转换为INTEGER[]

      SELECT 3186::INTEGER = ANY(
      (
          SELECT array_agg(c) AS c
          FROM (
             SELECT 3130::INTEGER AS c
             UNION
             SELECT 3135::INTEGER AS c
             UNION
             SELECT 2179::INTEGER AS c
             UNION
             SELECT 3186::INTEGER AS c
          ) AS v
      )::INTEGER[]);
      

      DBFiddle Demo

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-26
        • 2011-11-09
        相关资源
        最近更新 更多