使用 Oracle,如何将 IN 子句与多个数组一起使用?

时间:2021-03-24 14:21:52

标签: sql arrays oracle

一段时间以来,当我需要通过 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。但当然,这不适用于 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 个答案:

答案 0 :(得分:0)

如果使用语句 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
    );