这应该可以解决问题:
Declare @str VARCHAr(100) = 'A|B|C';DECLARE@Test TABLE ( Id INT ,Definition VARCHAr(100) )INSERT INTO @Test (Id, Definition)VALUES (1, 'A|B|C') ,(2, 'er|All|All|B') ,(3, 'All|All|All') ,(4, 'All|bela|All') ,(5, 'All|All|All|G') ,(6, 'A|All|All') ,(7, 'All|B|All') ,(8, 'Av|All|All|G');---------------------------------------------------------------------------WITH Tester AS( SELECt Id ,Definition ,(LEN(Definition) - LEN(REPLACE(Definition, 'All', ''))) / LEN('All') AS numAlls ,REPLACE(Definition, 'All', '%') AS Mask FROM @Test)SELECt TOP 1 Id ,DefinitionFROM TesterWHERe @str LIKE MaskORDER BY numAlls这里的主键是列:
(LEN(Definition) - LEN(REPLACe(Definition, 'All', ''))) / LEN('All') AS numAlls基本上,我接受您给出的顺序的想法,并通过简单地计算单词
All在定义中出现的次数而不是显式创建多个语句来使其变得更通用。
希望有道理/能解决问题!
编辑:
为了完整起见并解决@HABO在评论中提出的真正有效的观点,即上述解决方案在单词
All出现在字符串中的任何时间都将匹配,即使它是另一个语句/单词的一部分,下面的解决方案也是健壮/保证仅匹配以下情况
All:
WITH Tester AS( SELECT Id ,Definition ,(LEN('|' + Definition + '|') - LEN(REPLACE('|' + Definition + '|', '|All|', ''))) / LEN('|All|') AS numAlls ,REPLACE('|' + Definition + '|', '|All|', '|%|') AS Mask FROM @Test)SELECt TOP 1 Id ,DefinitionFROM TesterWHERe '|' + @str + '|' LIKE MaskORDER BY numAlls基本上,您可以
Definition使用分隔符(
|)将其括起来,以确保
Definition开头和结尾的每个部分都以分隔符(开始/结束值并非如此),然后我们就可以进行全文搜索
|All|。
希望这对为什么这是一个更加健壮的解决方案有意义。



