使用 Oracle,我如何使用带有多个数组的 IN 子句?

Posted

技术标签:

【中文标题】使用 Oracle,我如何使用带有多个数组的 IN 子句?【英文标题】:With Oracle, how can I use an IN clause with multiple Arrays? 【发布时间】:2021-03-24 14:21:52 【问题描述】:

一段时间以来,当我需要一次按 ID 选择多个实体并且我无法预测需要选择多少个实体时,我一直在使用这样的查询:

select * from MY_ENTITY where ID in (select * table(?))`

参数是一个 SQL ARRAY,无论是我的实体 ID 的相关类型。

这有点难看,但查询运行速度比使用in (?, ?, ?, ?, ....) 之类的要快得多。最重要的是,它不会因几乎相同的查询而使服务器端查询缓存膨胀,这些查询只是传递给IN 子句的参数数量不同。

所以这很好用。

但是,在某些情况下,我希望使用相同的值但具有成对的值。从概念上讲,我想做这样的事情:

select * from MY_ENTITY where (TAG_NAME, TAG_VALUE) in (TABLE(?, ?))`

其中每个参数都是相同长度的 SQL ARRAYs。但当然,这不适用于 Oracle。

到目前为止,我发现实现这项工作的唯一方法是相当可怕的(尽管它似乎有效)

select * 
from MY_ENTITY 
where (TAG_NAME, TAG_VALUE) IN (
    select TAG_NAME, TAG_VALUE
    from
        (select ROWNUM as IDX, column_value as TAG_NAME from TABLE(?)) A,
        (select ROWNUM as IDX, column_value as TAG_VALUE from TABLE(?)) B
    where
        A.IDX = B.IDX
    );

Oracle 有没有更简单的方法来做到这一点?

【问题讨论】:

【参考方案1】:

如果使用EXISTSNOT EXISTS语句,查询会更快。

在这些语句中,您只需在WHERE 子句中指定加入表的条件。

select * 
from MY_ENTITY my_ett
where EXISTS (
    select A.TAG_NAME, B.TAG_VALUE
    from
        (select ROWNUM as IDX, column_value as TAG_NAME from TABLE(?)) A,
        (select ROWNUM as IDX, column_value as TAG_VALUE from TABLE(?)) B
    where
        A.IDX = B.IDX AND A.TAG_NAME = my_ett.TAG_NAME AND B.TAG_VALUE = my_ett.TAG_VALUE
    );

【讨论】:

这是一种改进,但并不完全是我想要的那种改进。例如,Postgres 有一个非常方便的 unnest 函数,它将整个丑陋的子查询压缩为一个函数调用。我想知道甲骨文是否有类似的东西。 我只有 2 年的 Oracle 经验。我帮不了你。我的问题是 IN 语句,我用 EXISTS 解决了它,但我不知道你提到的用法。对不起。 别担心,Oracle 完全有可能根本没有更简单的方法。众所周知,这对开发人员来说很不方便。据说对管理员来说更好,但我不知道这是不是真的。

以上是关于使用 Oracle,我如何使用带有多个数组的 IN 子句?的主要内容,如果未能解决你的问题,请参考以下文章

IN() 子句 oracle PLSQL 中的数组

带有 IN 子句参数的 Oracle 存储过程

如何发送带有对象数组的多个数组发送到android

如何在 OpenGL 中使用立方体贴图数组来渲染带有阴影贴图的多个点光源?

PHP - 使用带有 IN 子句数组的 PDO

PHP - 使用带有 IN 子句数组的 PDO