场景
例如代码,号码共同确定唯一性。 突然有个变态的需求,入参要10对代码和号码。
解决方案
错误的写法
要特别注意,如下写法是错的,因为这样查出来的数据会多:
inv_kind in () and inv_num in ()
无论如何这2个条件要并列,以下几种写法都可。
多对条件or实现
select * from t_ticket
where (inv_kind='3100191130' and inv_num ='30656462')
or (inv_kind='021021600111' and inv_num ='12588351')
or (inv_kind='050001500111' and inv_num ='27884930')
union 来实现
select * from t_ticket where (inv_kind='3100191130' and inv_num ='30656462')
union select * from t_ticket where (inv_kind='021021600111' and inv_num ='12588351')
union select * from t_ticket where (inv_kind='050001500111' and inv_num ='27884930')
多列in实现
select * from t_ticket
where (inv_kind,inv_num)
in (('3100191130','30656462'),('021021600111','12588351'),('050001500111','27884930'))
其他
各种实现都不是很优雅,只能说这样的需求太变态。
解决in的另外一种方案
如果in的数量实在多,每次都手动拼,有一定的缺陷。
1、in 多条的话,超过一定数量,会非常影响性能。
2、如果有几千条,那么1次200条。也要执行很多次。
一种方案
新建一个表或者视图,把数据放进去,然后进行关联查询。
1、数据量大一些也没有关系。
2、多列的处理也不太费事。
如果in的数据固定了,这种方式不错。 如果是动态的数据,那么还是手动拼吧。