检查以特定字符串[SQL Server]开头的单词



我尝试搜索像Dhaka is the capital of Bangladesh这样包含六个单词的字符串。如果我的搜索文本是cap(这是大写的起始文本),它会给我字符串中搜索文本的起始索引(此处为14)。如果搜索文本包含在字符串中,但没有包含任何单词的起始文本,它会给我0。请查看测试用例以更好地理解。

我尝试了什么

DECLARE @SearchText VARCHAR(20),
@Str VARCHAR(MAX),
@Result INT
SET @Str = 'Dhaka is the capital of Bangladesh'
SET @SearchText = 'cap'
SET @Result = CASE WHEN @Str LIKE @SearchText + '%'
OR @Str LIKE + '% ' + @SearchText + '%' 
THEN CHARINDEX(@SearchText, @Str)
ELSE 0 END
PRINT @Result -- print 14 here

对于我的情况,我需要用另一个sql函数生成@Str。在这里,我们需要生成3次@Str,这是昂贵的(我认为)。那么,有没有办法让我只需要生成一次@Str?[使用PATINDEX]是否可能

注意:CASE条件出现在原始查询的where子句中。因此,不可能在变量中设置@Str值,然后在where子句中使用它。

测试用例

  1. Search Text:达卡Result:1
  2. Search Text:总计Result:0
  3. Search Text:MirpurResult:0
  4. Search Text:Result:0
  5. Search Text:Result:7
  6. Search Text:达卡首都Result:0

只需在字符串中添加前导空格,即可确保始终只找到单词的开头:

DECLARE @SearchText VARCHAR(20),
@Str VARCHAR(MAX),
@Result INT
SET @Str = 'Dhaka is the capital of Bangladesh'
SET @SearchText = 'Dhaka Capital'
SET @Result = CHARINDEX(' ' + @SearchText, ' ' + @Str)
PRINT @Result -- print 14 here

我已经针对您的测试用例测试了上述查询,它似乎有效。

在SELECT中每行只计算一次函数,使其成为表值函数。或者,如果由于某种原因无法使用CROSS APPLY

SELECT .. a, b,
FROM ..
CROSS APPLY (SELECT my_scalar_fn(a,b) as Str) arg
WHERE CASE WHEN arg.Str LIKE SearchText + '%'
OR arg.Str LIKE + '% ' + SearchText + '%' 
THEN CHARINDEX(SearchText, arg.Str)
ELSE 0 END

相关内容

  • 没有找到相关文章

最新更新