sql 循环用FIND_IN_SET配合OR使用
时间: 2023-10-20 09:34:55 浏览: 160
在 SQL 中,可以使用 FIND_IN_SET 函数配合 OR 来实现循环的效果。FIND_IN_SET 函数用于在一个逗号分隔的字符串中查找指定值的位置。下面是一个示例:
```
SELECT *
FROM table_name
WHERE FIND_IN_SET(value, column_name) > 0 OR FIND_IN_SET(another_value, column_name) > 0;
```
在上面的示例中,`value` 和 `another_value` 是你想要查找的值,`column_name` 是包含逗号分隔值的列名。使用 FIND_IN_SET 函数可以检查这两个值是否存在于 `column_name` 列中,如果存在则返回大于 0 的值,然后配合 OR 运算符判断其中之一存在即可。
请注意,使用逗号分隔的值存储在数据库中并不是一种良好的设计方式,这可能导致查询性能下降。如果可能的话,建议考虑使用关联表来存储这些值。
相关问题
mysql 循环拼接 find_in_set(#{gpbm},t1.GoodsSN)
在MySQL中,`FIND_IN_SET`函数用于查找一个字符串是否在一个逗号分隔的字符串列表中。这个函数在处理动态查询和条件拼接时非常有用。
如果你需要在MySQL中循环拼接`FIND_IN_SET`函数,可以结合使用循环结构和字符串拼接函数。以下是一个示例,假设你有一个表`t1`,其中有一个字段`GoodsSN`,你希望根据某些条件拼接多个`FIND_IN_SET`条件:
```sql
SET @sql = '';
SET @gpbm_list = 'value1,value2,value3'; -- 你的gpbm值列表
-- 循环拼接FIND_IN_SET条件
WHILE LOCATE(',', @gpbm_list) > 0 DO
SET @current_gpbm = SUBSTRING_INDEX(@gpbm_list, ',', 1);
SET @sql = CONCAT(@sql, ' OR find_in_set(''', @current_gpbm, ''', t1.GoodsSN)');
SET @gpbm_list = SUBSTRING(@gpbm_list, LOCATE(',', @gpbm_list) + 1);
END WHILE;
-- 处理最后一个值
SET @sql = CONCAT('SELECT * FROM t1 WHERE 1=0', @sql, ' OR find_in_set(''', @gpbm_list, ''', t1.GoodsSN)');
-- 执行拼接后的SQL
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
```
在这个示例中:
1. `@sql`用于存储拼接后的SQL条件。
2. `@gpbm_list`是你要拼接的`gpbm`值列表。
3. 使用`WHILE`循环和`SUBSTRING_INDEX`函数逐个提取`gpbm`值,并拼接`FIND_IN_SET`条件。
4. 最后,使用`PREPARE`和`EXECUTE`执行拼接后的SQL语句。
mybatisplus FIND_IN_SET
FIND_IN_SET是MySQL中的一个函数,用于判断一个值是否存在于一个逗号分隔的字符串列表中。在mybatis-plus中,你可以使用lambda().apply方法来拼接SQL,实现类似的功能。下面是一个示例代码:
List<String> realIds = crmProgrammeService.getIdsByRealEstateNames(name);
if (!CollectionUtils.isEmpty(realIds)){
if (realIds.size() == 1){
queryWrapper.like("real_estate_ids", realIds.get(0));
} else {
for (int i = 0; i < realIds.size(); i++) {
if (i == 0) {
queryWrapper.apply(null != realIds.get(i), "(find_in_set({0},real_estate_ids)", realIds.get(i));
} else {
if (i == realIds.size() - 1) {
queryWrapper.or().apply(null != realIds.get(i), "find_in_set({0},real_estate_ids))", realIds.get(i));
} else {
queryWrapper.or().apply(null != realIds.get(i), "find_in_set({0},real_estate_ids)", realIds.get(i));
}
}
}
}
} else {
queryWrapper.isNull("real_estate_ids");
}
这段代码首先通过crmProgrammeService.getIdsByRealEstateNames(name)方法获取到realIds列表。然后根据列表的长度来确定使用like还是find_in_set函数进行查询条件的拼接。如果realIds只有一个元素,使用like方法拼接查询条件;如果realIds有多个元素,使用循环和apply方法拼接find_in_set函数的查询条件,并使用or方法进行逻辑连接。如果realIds为空,查询条件为real_estate_ids为空。
阅读全文
相关推荐















