Bootstrap

mysql以,分隔的精确匹配方法HQL和SQL

可以看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来强制排序。

我们修改一下新闻表数据。

如图:

;