使用 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 ARRAY
s。但当然,这不适用于 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】:如果使用EXISTS
或NOT 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 子句?的主要内容,如果未能解决你的问题,请参考以下文章