我在这里看到很多关于在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>
我也必须在循环中包含条件。
等待专家意见。 提前谢谢。
答案 0 :(得分:7)
你在找这样的东西吗?
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
. . .
答案 1 :(得分: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*