5

我在这里看到了很多关于在 IN 子句中使用元组的问题。我的情况和其他人有点不同。IN 子句中元组的一般用法如下所示

    Select * from MY_TABLE
    where (id,name,date) IN ((1,'new','10-JUL-13'),(2, 'old','09-JUN-13'))

考虑到上述查询,我​​的要求是检索具有 id 和 name 值以及特定范围内的日期的记录。让我们说

    effectiveDate <= date <= termDate  

我正在使用ORACLE数据库和MyBatis ORM。我将数据作为对象列表获取,因此当我使用 mybatis 时,我可以使用foreach/for循环来填充元组,但是当我想对来自对象的这些值之一使用条件时。

当我将 Mybatis 用于从列表中读取的一个值时,where 子句如下

    <where>
        and (id,name) IN
   <foreach item="object" collection="data" open="(" separator=","close=")">
    (#{object.id},#{object.name})
   </foreach>
    </where>

我还必须在循环中包含条件。

等待专家建议。提前致谢。

4

2 回答 2

9

你在寻找这样的东西吗?

select *
from MY_TABLE
where (id, name) in ((1,'new'), (2, 'old')) and
      date between effectiveDate and termDate

这会在列表中查找对,然后检查一系列日期之间的日期。

编辑:

我认为您想将其分解为多个子句,每组值一个子句:

where (id = 1 and name = 'new' and date between eff1 and term1) or
      (id = 2 and name = 'old' and date between eff2 and term2) or
      . . .
于 2013-07-17T01:23:58.920 回答
2

我的问题的上述解决方案在下面为Mybatis用户重写

    <where>
    <foreach item="object" collection="data" separator="OR">
      (id = #{object.id} AND name = #{object.name} AND (effDt < #{object.date} < termDt))
    </foreach>
    </where>

当您使用 IN 或 OR 来分隔 WHERE 子句中的数据/条件时,不会有很大的性能差异。

    FYI : *http://stackoverflow.com/questions/3074713/in-vs-or-in-the-sql-where-clause*
于 2013-07-17T19:46:31.813 回答