sql函数--10---In 多个字段

发布于:2024-05-09 ⋅ 阅读:(25) ⋅ 点赞:(0)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


1.普通 in语句查询

sql

select * from HealthCoupon where useType in ( '4' , '3' )

MyBatis

错误写法

如果在MyBatis中的使用in的话,像如下去做的话,肯定会报错:
其中useType=“2,3”;这样的写法,看似很简单,但是MyBatis不支持。

Map<String, Object> selectByUserId(@Param("useType") String useType)
    <select id="selectByUserId" resultMap="BaseResultMap" parameterType="java.lang.String">
		select * from HealthCoupon where useType in (#{useType,jdbcType=VARCHAR})
    </select>

正确写法

MyBatis中提供了foreach语句实现IN查询,foreach语法如下

​ foreach语句中, collection属性的参数类型可以使:List、数组、map集合

  • ​ collection: 必须跟mapper.java中@Param标签指定的元素名一样
  • item: 表示在迭代过程中每一个元素的别名,可以随便起名,但是必须跟元素中的#{}里面的名称一样。
  • index:表示在迭代过程中每次迭代到的位置(下标)
  • open:前缀, sql语句中集合都必须用小括号()括起来
  • close:后缀
  • separator:分隔符,表示迭代时每个元素之间以什么分隔
List
List<User> selectByIdSet(List idList);

 
<select id="selectByIdSet" resultMap="BaseResultMap">
	SELECT
	<include refid="Base_Column_List" />
	from t_user
	WHERE id IN
	<foreach collection="list" item="id" index="index" open="(" close=")" separator=",">
	  #{id}
	</foreach>
</select>


String[]
  • 如果参数的类型是Array,则在使用时,collection属性要必须指定为 array
List<User> selectByIdSet(String[] idList);
<select id="selectByIdSet" resultMap="BaseResultMap">
	SELECT
	<include refid="Base_Column_List" />
	from t_user
	WHERE id IN
	<foreach collection="array" item="id" index="index" open="(" close=")" separator=",">
	  #{id}
	</foreach>
</select>

2.In多个字段

需要根据两个字段去查询多个值,这两个字段值不同的数据,

sql

SELECT * FROM more_in 
WHERE (lmm_id, item_id, `name`) IN ( (1,2, '工料机1') , (2,2, '工料机2') , (3,3, '') );

案例

脚本实例:

 
-- ----------------------------
-- Table structure for more_in
-- ----------------------------
DROP TABLE IF EXISTS `more_in`;
CREATE TABLE `more_in`  (
  `id` int NOT NULL AUTO_INCREMENT,
  `lmm_id` int NULL DEFAULT NULL,
  `item_id` int NULL DEFAULT NULL,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `detail` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
 
-- ----------------------------
-- Records of more_in
-- ----------------------------
INSERT INTO `more_in` VALUES (1, 1, 2, '工料机1', NULL);
INSERT INTO `more_in` VALUES (2, 2, 2, '工料机2', NULL);
INSERT INTO `more_in` VALUES (3, 3, 3, '工料机3', NULL);
INSERT INTO `more_in` VALUES (4, 4, 3, '工料机4', NULL);
INSERT INTO `more_in` VALUES (5, 5, 1, '工料机5', NULL);
INSERT INTO `more_in` VALUES (6, 2, 3, '工料机6', NULL);

在这里插入图片描述

错误写法:

SELECT * FROM more_in a
WHERE a.lmm_id IN (1,2,3) AND a.item_id IN (2,2,3);

通过如下语句查询,会多出ID为6的数据:
在这里插入图片描述

正确写法:

IN同时可以In多个字段,In的左侧两个字段,右侧必须俩字段,左右两侧能对应上:

SELECT * FROM more_in WHERE (lmm_id, item_id) IN ((1,2),(2,2),(3,3));

在这里插入图片描述

MyBatis XML 写法:

List<UserDto> selectByUserNameAndAge(List<User> list);
<select id="getResult" resultType="java.util.HashMap">
	select * from demo t where (t.id, t.name) in
	<foreach collection="list" item="item" open="(" close=")" separator=",">
		(#{item.id},#{item.name})
	</foreach>
</select>