MySQL模糊查询二三事

举报
GoodTimeGGB 发表于 2024/03/15 16:23:49 2024/03/15
【摘要】 1、源数据信息源数据字段:Student表字段Names 存储内容为"111,222,333,444,555,666,777,888" 2、查询请求入参{ "Names": "666,888"} 3、具体需求需要拿到既包含666又包含888,直接模糊查询或者Contains之类的无法满足 4、方法实现 方法一:// 纯SQL语句var nameSql = string.Empty;f...

1、源数据信息

源数据字段:Student表字段Names 存储内容为"111,222,333,444,555,666,777,888"

2、查询请求入参

{
    "Names": "666,888"
}

3、具体需求

需要拿到既包含666又包含888,直接模糊查询或者Contains之类的无法满足

4、方法实现

方法一:

// 纯SQL语句

var nameSql = string.Empty;
for (int i = 0; i < namesList.Count; i++)
{
    nameSql += $"FIND_IN_SET('{namesList[i]}', REPLACE(names, ',', ',')) > 0";
    if (i != namesList.Count - 1)
        nameSql += " OR ";
}
var list = _student.AsQueryable()
    .WhereIF(args.Names.IsNotNullAndEmpty(), $"({nameSql})")
    .Where(x => x.Status > 0)
    .OrderBy(x => x.ID, OrderByType.Desc)
    .ToPageList(page.CurrenetPageIndex, page.PageSize, ref counts, ref pageCounts);

生成SQL如下:

SELECT
	*  
FROM
	`Student`  
WHERE
	(
  FIND_IN_SET(
  	'666',
  REPLACE ( Names, ',', ',' )) > 0  
  OR FIND_IN_SET(
  	'888',
  REPLACE ( Names, ',', ',' )) > 0  
	)  
	AND ( `Status` > 0 )  
ORDER BY
	`ID` DESC  
	LIMIT 0,10
方法二:

// 动态表达式 (推荐)

var namesList = new List<string>();
if (args.Names.IsNotNullAndEmpty())
    namesList = args.Names.Split(',').ToList();
Expressionable<WashRulegroup> exp_names = Expressionable.Create<WashRulegroup>();
foreach (var name in namesList)
{
    exp_names.Or(t => t.names.Contains(name));
}
var list = _rulegroup.AsQueryable()
    .WhereIF(args.Names.IsNotNullAndEmpty(), exp_names.ToExpression())
    .Where(x => x.Status > 0)
    .OrderBy(x => x.ID, OrderByType.Desc)
    .ToPageList(page.CurrenetPageIndex, page.PageSize, ref counts, ref pageCounts);

生成SQL如下:

SELECT
	*  
FROM
	`Student`  
WHERE
	(( `Names` LIKE concat( '%', '666', '%' )) OR ( `Names` LIKE concat( '%', '888', '%' )) )  
	AND ( `Status` > 0 )  
ORDER BY
	`ID` DESC  
	LIMIT 0,10

注:本文使用orm为sqlsugar

希望以上内容能够帮助你理解和学习MySQL模糊查询。欢迎点赞、关注、收藏,如果你还有其他问题,欢迎评论区交流。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。