【问题标题】:Operator does not exist: character varying = character varying[]运算符不存在:字符变化 = 字符变化 []
【发布时间】:2020-02-27 06:29:22
【问题描述】:

正如您在我的 SQL 请求中看到的,我有一个返回字符串数组 (varchar[]) 的子查询。我正在尝试通过我在ANY 命令中传递的这个数组过滤table_1 值。出于某种原因,我看到了这个错误:

错误:运算符不存在:字符变化 = 字符变化 [] 没有运算符与给定的名称和参数类型匹配。您可能需要添加显式类型转换。

table_1.column_atable_2.column_a 列的数据类型为varchar

PostgreSQL 版本:11.4

我在哪里做错了?

select
    table_1.*
from
    table_1
where
    table_1.column_a = any(
        select
            array_agg(table_2.column_a)
        from
            table_2
    )

当然,我可以使用这样的代码,但是我想知道第一次查询出错的原因:

select
    table_1.*
from
    table_1
where
    table_1.column_a in(
        select
            table_2.column_a
        from
            table_2
    )

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    您的子查询:

    select
        array_agg(table_2.column_a)
    from
        table_2
    

    返回一个 varchar 数组,不是一个 varchar 数组。因此,您尝试将 varchar (table_1.column_a) 与 varchar (array_agg(table_2.column_a)) 数组进行比较,这是不可能的。考虑您的子查询是否有明确的 group by 子句,例如

    select
        array_agg(table_2.column_a)
    from
        table_2
    group by table_2.column_b
    

    在这种情况下,很明显查询返回了一个 varchar 数组(每个 table_2.column_b 值一个)。在您的第一个查询中,有一个隐式的group by 子句,它导致输出是一个varchar 数组的数组。您可以使用:

    select
        table_2.column_a
    from
        table_2
    

    它会正常工作(在这种情况下,= any 等同于in)。

    【讨论】:

      【解决方案2】:

      您已经有一个数组。所以使用exists:

      where exists (select 1
                    from table_2 t2
                    where table_1.column_a = any(t2.column_a)
                   )
      

      无需将数组组合成一个更大的数组,只需解析该数组以查找另一个值。

      【讨论】:

        猜你喜欢
        • 2020-03-19
        • 2017-06-23
        • 2021-11-15
        • 2018-12-16
        • 2012-07-02
        • 1970-01-01
        • 1970-01-01
        • 2018-02-17
        • 2012-05-19
        相关资源
        最近更新 更多