【问题标题】:IN operator in join predicate连接谓词中的 IN 运算符
【发布时间】:2015-05-22 03:32:26
【问题描述】:

我正在尝试在 Postgresql 中加入 2 个表。 table1 中的 col1 是字符变量类型,表 2 中的 col2 是字符变量 []

类型

有人知道为什么使用 IN 运算符不起作用吗?

这是查询:

SELECT t1.*, t2.* FROM table1 t1 INNER JOIN table2 t2 ON t1.col1 in t2.col2

这是错误: ERROR: syntax error at or near "t2"

另外, SELECT t1.*, t2.* FROM table1 t1 INNER JOIN table2 t2 ON t1.col1 in unnest(t2.col2)

失败 ERROR: syntax error at or near "unnest"

【问题讨论】:

    标签: postgresql join


    【解决方案1】:

    使用您当前拥有的代码,IN 表达式的两边都是单个值。对于IN,右侧应该是一个数组或多值表达式,而不是一个奇异值。

    如果它们真的是单个值,那么你想要的是这样的:

    SELECT t1.*, t2.*
    FROM table1 t1 INNER JOIN table2 t2 ON t1.col1 = t2.col2;
    

    如果右侧确实有一个列表表达式,您可以这样做:

    SELECT t1.*, t2.*
    FROM table1 t1 INNER JOIN table2 t2 ON t1.col1 IN (t2.col2, t2.col3);
    

    根据 OP 的评论进行编辑:

    IN 不会在 arrays 上运行。相反,它在 row 上运行。您可以尝试使用 ANY 代替,它确实在 arrays 上运行。

    文档将IN 描述为:

    右侧是标量表达式的括号列表。

    ANY 在哪里:

    右边是一个带括号的表达式,它必须产生一个 数组值。

    有关INANY 等的更多详细信息,请参阅Postgres doc

    【讨论】:

    • 但是如果 t1.col1 是一个字符串,而 t2.col2 是一个字符串数组,那么 t1.col1 IN t2.col2 不应该可以吗?您将如何检查 t1.col1 中的字符串是否包含在数组 t2.col2 中?此外,t1.col1 IN unnest(t2.col2) 失败并出现类似的语法错误。
    猜你喜欢
    • 2011-01-13
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    相关资源
    最近更新 更多