运算符不存在:character varying = character varying[]。

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

ERROR: operator does not exist: character varying = character varying[] No operator matches the given name and argument types. You might need to add explicit type casts.

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
    )
2个回答

4

您的子查询:

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,所以它可以正常使用。


0
你已经有一个数组了。所以使用exists函数:
where exists (select 1
              from table_2 t2
              where table_1.column_a = any(t2.column_a)
             )

不需要将数组合并成一个更大的数组,只是为了解析该数组以查找另一个值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接