关于sql模糊匹配不精准的问题

比如 一个字段的值是 10139,5512,6341,63453

这个是我会员表的ID,我是根据模糊匹配 这个字段来查看他整个团队会员的ID

但是 我用like %3453% 结果把这个63453 给匹配进去了,请问有什么办法解决吗?

那要看你团队会员的ID有哪些共同点,用like %3453%是会匹配到63453 :
你可以:

select * from table where id like '%,3453%' or  id like '3453,%'

如果like实现不了,还可以使用正则匹配regexp 关键字:
比如以3453开头的:

select * from table  where id  regexp '^3453' 

具体的可以详聊。

',' + fieldne + ',' like '%,' + memberCardNo + ',%'

“Devil组”引证GPT后的撰写:

FIND_IN_SET 函数

SELECT * FROM members WHERE FIND_IN_SET('3453', member_id) > 0;

SELECT * FROM member_table WHERE member_id REGEXP '(^|,)3453($|,)';

1、使用正则匹配是一种方式
2、简单点的,like '%3543%' and not like '%3543'

第一种方法,把表结构调整下,将会员的id信息拆分到关系表中,这样就可以通过精准匹配来解决。
第二种可以试试用正则表达式来解决

引用chatGPT的回答和自己的思路,可以使用正则表达式来限定匹配的范围,具体的方法是使用正则表达式元字符的边界限定符号 "\b" 来限制匹配的范围。

例如,您可以使用以下语句来限制只匹配字段值中以逗号 "," 或字符串开始的数字序列,以及以逗号 "," 或字符串结尾的数字序列:

SELECT * FROM members WHERE field REGEXP '(^|,)3453($|,)';

其中,"^" 表示字符串的开始,"$" 表示字符串的结束, "|" 表示逻辑 "或", "," 表示字段值中数字序列之间的分隔符。

这样,只有数字序列 "63453" 会被匹配,而不会匹配到其他的数字序列,比如 "10139" 或 "5512"。

可以考虑采用通配符进行匹配 []

该回答引用ChatGPT

可以使用 SQL 中的正则表达式来解决这个问题。使用正则表达式可以精确匹配目标字符串的开头和结尾,从而避免不精确匹配的问题。

以下是一个示例 SQL 查询语句,使用正则表达式来精确匹配以逗号开头或以逗号结尾的字符串,同时也可以匹配不以逗号开头或结尾的字符串:

SELECT * FROM member WHERE member_ids REGEXP '(^|,)63453($|,)';

其中,member 是您的会员表的名称,member_ids 是包含会员 ID 的字段名称。该查询语句使用 REGEXP 操作符和正则表达式来匹配以逗号开头或结尾的字符串。(^|,) 表示以逗号或行首开始,($|,) 表示以逗号或行尾结尾,中间的 63453 是要精确匹配的目标字符串。

如果您想查找包含特定子字符串的字符串,可以将查询语句中的 63453 替换为您要匹配的子字符串即可。例如,要查找包含子字符串 345 的字符串,可以将查询语句中的 (^|,)63453($|,) 替换为 (^|,)345($|,)。

该回答引用GPTᴼᴾᴱᴺᴬᴵ
当使用 SQL 的 LIKE 操作符进行模糊匹配时,确实可能出现您描述的问题。例如,您使用的 LIKE '%3453%' 表示查找包含 '3453' 的任何字符串,这会匹配到包含 '63453' 的字符串。
·
要解决这个问题,您可以使用 SQL 的正则表达式(Regular Expression)功能,使用 REGEXP 或 RLIKE 操作符来进行更精确的匹配。以下是一些示例:

  1. 查找以 '3453' 结尾的字符串,可以使用 RLIKE '3453$' 或 REGEXP '3453$'。
  2. 查找以 '3453' 开头的字符串,可以使用 RLIKE '^3453' 或 REGEXP '^3453'。
  3. 查找包含 ',3453,' 的字符串,可以使用 RLIKE ',3453,' 或 REGEXP ',3453,'。

请注意,正则表达式的语法可能会略微有所不同,具体取决于您使用的 SQL 数据库管理系统。但是,这些示例可以为您提供一些思路,以便更准确地匹配您需要的字符串。

您可以在匹配字符串时,将字段值前后分别加上逗号,这样就可以避免出现像您所描述的问题。具体做法如下:

1.在查询时,将要匹配的字符串前后分别加上逗号。例如,您要匹配的字符串是"3453",则查询条件应该写成:like '%,3453,%'。这样就能确保只匹配到完整的ID,而不是出现在其他ID中的子串。

2.在将数据插入到会员表中时,也可以将ID前后加上逗号,这样就能避免以后出现类似的问题。

例如,如果原来的ID是"10139,5512,6341,63453",您可以将其转换为",10139,5512,6341,63453,",然后将其存入数据库中。这样,在查询时就可以使用逗号包裹的ID,避免出现不精准的匹配问题。

总之,通过在要匹配的字符串前后加上逗号,可以避免模糊匹配时出现不精准的情况。

like %3453% 当然会把这个63453 结果检索到了,你like %3453%就表示只要包含3453就都筛选出来, 3453%表示3453开头的 %3453 表示3453结尾的

参考GPT和自己的思路,当使用SQL的LIKE操作符进行模糊匹配时,它会匹配包含指定字符串的任何字符串。这可能导致匹配到不想匹配的字符串。为了解决这个问题,可以考虑使用正则表达式或其他字符串函数来进行更准确的匹配。

一种解决方法是使用正则表达式函数。在MySQL中,可以使用REGEXP或RLIKE函数来执行正则表达式匹配。例如,你可以使用以下查询来匹配以逗号分隔的数字列表中的整数值:

SELECT * FROM members WHERE ids REGEXP '[[:<:]]63453[[:>:]]'


这将匹配ids字段中包含整数值63453的字符串,但不会匹配包含其他数字的字符串,例如10139。

另一种解决方法是使用字符串函数来匹配整数值。你可以使用FIND_IN_SET函数来查找包含指定整数值的逗号分隔的列表。例如:

SELECT * FROM members WHERE FIND_IN_SET('63453', REPLACE(ids, ' ', '')) > 0


这将匹配ids字段中包含整数值63453的字符串,但不会匹配包含其他数字的字符串,例如10139。

请注意,这两种方法都需要对查询进行一些调整,并且可能会影响查询的性能。你应该根据你的数据和查询需求选择最合适的方法。

可以使用正则表达式来解决这个问题。正则表达式可以更精确地匹配指定模式的字符串。在这种情况下,你可以使用 ^ 和 $ 来限定匹配内容的开头和结尾,确保只匹配完全符合要求的字符串。下面是一个例子:

SELECT * FROM members WHERE id REGEXP '^63453$'

这会返回一个完全匹配 ID 为 63453 的会员。如果你需要匹配一组相似的 ID,你可以在正则表达式中使用 | 符号来分隔不同的模式。例如:

SELECT * FROM members WHERE id REGEXP '^1013[89]$|^55[12].6341$|^63453$'

这将匹配 ID 为 10138、10139、5512.6341 和 63453 的会员。请注意,使用正则表达式可能会降低查询性能,因此你应该仅在需要时使用它。

为了精准查询,设计字段数值时,记得前后都要加入,如
10139,5512,6341,63453可以这样,这样防干扰性更好

 ,10139,5512,6341,63453,

查询时精准查询:

select * from TB  where id=',6341,'

模糊查询:

select * from TBwhere id like '%,6341%' or  id like '%6341,%'

既然是模糊查询,查到相似数据是正常,除非你SQL语句用正则匹配精准查询;但是也失去了模糊查询的意义;

在 SQL 中,LIKE 操作符用于模糊匹配字符串。它支持使用 % 和 _ 通配符匹配任意字符和单个字符。因此,当你使用 like '%3453%' 时,它会匹配到包含 3453 的任何字符串,包括 63453。为了避免这种情况,你可以使用一个更精确的模式,如:

  • like '%,3453,%',这样可以确保只匹配包含 3453 的单独会员ID,而不是在其他ID中的一部分。
  • like '63453,%' 或 like '%,63453,%',这样可以确保只匹配以 63453 开头或以 63453 结尾的会员ID,而不是包含 63453 的任何其他ID。

以下是一些示例查询,用于演示如何使用这些模式进行模糊匹配:

-- 匹配包含 3453 的单独会员ID
SELECT * FROM members WHERE ids LIKE '%,3453,%';

-- 匹配以 63453 开头的会员ID
SELECT * FROM members WHERE ids LIKE '63453,%';

-- 匹配以 63453 结尾的会员ID
SELECT * FROM members WHERE ids LIKE '%,63453';

请注意,使用这些模式可能会稍微降低查询的性能,因为它们需要在字符串中进行更复杂的匹配。但是,这是一种比匹配错误的更精确的方法。

具体描述以下问题,数据是什么,预期要得到什么数据,实际上得到了什么数据,描述详细以下,方便给你回答。
另外like '%3453%',这样会匹配到所有包含 3453 的会员id的

加上分割符号即可, 具体如下:


with c1 as (
    select '10139,5512,6341,63453' as ids
    union all
    select '10139,5512,6341,3453' as ids
)

select * from c1 where (ids like '%,3453' or ids like '%,3453,%' or ids like '3453,%');


测试数据输出结果:

img

好像有个是可以去除的语法!

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
这个问题可以通过在匹配值前后增加分隔符的方式来解决,比如在该字段的值前后都加上逗号,变成",10139,5512,6341,63453,",然后对查询的匹配值也增加逗号,变成"%,3453,%",这样就可以避免匹配到63453了。

以下是一些示例代码,假设要查询团队成员ID中包含"3453"的会员记录:

MySQL:

SELECT * FROM members WHERE CONCAT(',', team_member_ids, ',') LIKE '%,3453,%';

PostgreSQL:

SELECT * FROM members WHERE CONCAT(',', team_member_ids, ',') LIKE '%,3453,%';

其中,CONCAT函数用于将团队成员ID前后加上逗号,以便于字符串匹配。在查询时,需要将匹配值前后也加上逗号,以避免匹配到子串。
如果我的回答解决了您的问题,请采纳!

那为什么不用=查询呢?模糊查询就是能匹配到的所有模糊数据查询出来,你这需要精确查询使用=就行了啊

解决方案:

  1. 可以使用双百分号来搜索,例如:LIKE '%6345%%',将搜索结果限定为“以6345开头”,来限定结果范围。
  2. 可以使用正则表达式,如:REGEXP '^6345',这样可以用来精确的搜索某字符串的开头。
  3. 如果是搜索某个单词,可以使用全文检索,这样可以精确地搜索某个单词。4. 可以使用 LIKE SUBSTRING,可以在 SELECT 子句中使用 SUBSTRING 来获得某个字段的指定长度的字符串,然后再使用 LIKE 操作,如:LIKE SUBSTRING('字段名', 0, 5)

该回答引用CHATGPT
这种情况下,您可以使用FIND_IN_SET函数进行匹配。该函数可以在一个逗号分隔的字符串中查找一个特定的值。以下是一个示例代码:

SELECT * FROM members WHERE FIND_IN_SET('63453', member_ids);

在上面的示例中,members是您的会员表,member_ids是包含会员ID的字段。该代码将返回包含63453的记录,但不会返回包含3453的记录。

此外,您还可以考虑使用正则表达式进行匹配。例如,您可以使用REGEXP运算符来匹配整个单词,而不是匹配单词的一部分。以下是一个示例代码:

SELECT * FROM members WHERE member_ids REGEXP '[[:<:]]63453[[:>:]]';

在上面的示例中,[[:<:]][[:>:]]是正则表达式的边界符号,用于匹配整个单词。该代码将返回包含63453的记录,但不会返回包含3453的记录。

您可以尝试使用通配符来精确匹配目标ID,而不是使用 LIKE 操作符。

在您的例子中,您可以使用以下查询来精确匹配包含数字 63453 的 ID:

SELECT * FROM members WHERE CONCAT(',', id, ',') LIKE '%,63453,%';

上述查询会在会员ID的前后添加逗号,以确保只匹配完整的 ID,而不是匹配到包含目标数字的其他 ID。

另外,您也可以使用正则表达式来匹配固定长度的数字串。例如,以下查询将匹配包含 5 位数字 63453 的 ID:

SELECT * FROM members WHERE id REGEXP '[[:<:]]63453[[:>:]]';

希望这些方法可以帮助您解决问题。


select * from table where id like '3453%' ;
 

在SQL中,LIKE运算符使用模式匹配来查找符合指定模式的字符串。%表示零个或多个字符,所以使用LIKE '%3453%'时,63453也会匹配到。如果您想要精确匹配,可以考虑使用以下方法:

  1. 使用正则表达式:在SQL Server中,可以使用PATINDEX()和LIKE结合使用,以使用正则表达式进行匹配。例如,您可以使用以下查询来匹配包含完整单词“3453”的字符串:
SELECT * FROM Members WHERE FieldName LIKE '%[^0-9]3453[^0-9]%';

在此查询中,[^0-9]表示不是数字的任何字符。
2. 使用FIND_IN_SET函数:如果您将多个值存储在一个字段中,可以使用FIND_IN_SET函数来查找匹配项。例如,您可以使用以下查询来查找包含ID 63453的记录:

SELECT * FROM Members WHERE FIND_IN_SET('63453', FieldName) > 0;

在此查询中,FIND_IN_SET函数将在逗号分隔的列表中查找匹配项。

可以使用正则表达式进行匹配,将模糊匹配的%通配符替换成正则表达式的符号。
例如,将like '%3453%'中的%通配符替换成正则表达式的符号:
将%替换成.*
将_替换成.
那么,like '%3453%'可替换成正则表达式:
^.3453.$
这个正则表达式意味着:
这个字段中以3453开头或者结尾的ID
或者这个字段中间含有3453的ID
使用这个正则表达式进行查询,就可以避免将63453匹配进去的问题。
Try again

SQL模糊匹配不精准可以通过以下几种方法解决:

  1. 使用正则表达式:在模糊匹配时,使用正则表达式可以更精确地匹配需要的数据,提高匹配的准确性。

  2. 使用LIKE添加通配符:使用LIKE操作符时,可以在查询的字符串中添加通配符,如%(匹配任意个字符)或_(匹配一个字符),以便更精确地匹配。

  3. 使用全文检索:全文检索是指在文档中查找关键字或短语,而不是基于约束或结构。在将大量文本数据存储到数据库中时,全文检索可以优化模糊匹配效率。

  4. 使用索引:为模糊查询列添加索引可以提高查询速度,提高匹配的精确度。

总之,多种方法可以提高SQL模糊匹配的精确度,需要根据实际需求选择合适的方法。

对于这个问题,可以使用正则表达式来解决。正则表达式可以用于更精确的匹配,而不会将字符串中的子字符串误认为是匹配项。在这种情况下,可以使用正则表达式中的\b表示单词的边界。例如,可以使用REGEXP或RLIKE操作符来匹配整个字段中包含特定数字的子字符串,而不是匹配整个字段。具体而言,可以使用以下查询语句:

SELECT * FROM member_table WHERE member_ids REGEXP '[[:<:]]63453[[:>:]]';
其中,member_table是会员表的表名,member_ids是包含所有会员ID的字段,[[:<:]]和[[:>:]]分别表示单词的开头和结尾。

如果需要匹配多个数字,可以使用|操作符来实现逻辑或。例如,要匹配数字63453或10139,可以使用以下查询语句:
SELECT * FROM member_table WHERE member_ids REGEXP '[:<:][[:>:]]';
这将匹配包含数字63453或10139的子字符串。
另外,如果要在更大的数据集中执行模糊匹配,可以考虑使用全文搜索引擎,如Elasticsearch或Solr。这些搜索引擎使用倒排索引等技术来加快搜索速度,并提供更高级别的匹配功能。