可以看find_in_set
我们在sql中经常会遇到模糊匹配,但是有的地方却不能简单的用like来区分
find_in_set(str1,str2) 函数:返回str2中str1所在的位置索引,其中str2必须以","分割开。
使用语法:
select * form table where FIND_IN_SET(str,strlist)。
如:
如
或者说:
find_in_set(str1,str2)还可以查找到str1所在str2中位置。
同样适用上面的例子数据。
sql语句:
select FIND_IN_SET(2,type) from t_news
还可以适用find_in_set来强制排序。
我们修改一下新闻表数据。
如图:
还可以适用find_in_set来强制排序。
我们修改一下新闻表数据。
如图:
现在我们有一个需求,需要根据type为2,1,3这种顺序排序。
sql语句:
select * from t_news order by find_in_set(type,'2,1,3');
结果:
SQL写法与动态设置值:
/** * 查询调色订单详情 * * @param id 订单id * @return */ @Override public Map<String, Object> saveGetColorOrder(Long id) { String sql = "SELECT\n" + " mc.*,\n" + " mo.maor_no,\n" + " IF(mo.maor_pay_date!=NULL ,0 ,1) isPayed\n" + "FROM mall_order_color mc LEFT OUTER JOIN mall_order mo ON mo.maor_id = mc.mcol_gen_order_id\n" + "WHERE FIND_IN_SET(:id,mc.mcol_order_id) and mc.mcol_payed=1"; Map<String, Object> params = new HashMap<>(); params.put("id",id); List<Map<String, Object>> list = manageDao.findMapBySQL(sql, params); OperationRecord record = new OperationRecord(); record.setOrecOperationType(OperationRecord.OPERATION_FIND); record.setOrecOperation("查询调色订单详情"); record.setOrecOperationDetail("查询调色订单详情:订单id=" + id); manageDao.saveOperationRecord(record); return CollectionUtils.isNotEmpty(list) ? list.get(0) : null; }
HQL写法:
注意:HQL写法一定要写>0,不然直接报错。
hql = "from MallOrderColor moc where find_in_set(:id,moc.mcolOrderId)>0 and mcolPayed=1"; for (String id : ids) { params.clear(); params.put("id", id ); List<MallOrderColor> colors = appDao.getList(hql, params); if (CollectionUtils.isNotEmpty(colors)) { throw new BusiHandlerException("该订单:" + id + "已经生成调色订单,不能重复生成"); } }
还可以适用find_in_set来强制排序。
我们修改一下新闻表数据。
如图: