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

时间:2016-06-08 09:29:12

标签: sql sql-server patindex

我尝试搜索包含六个单词的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。在这里,我们需要生成@Str 3次,这是昂贵的(我认为)。那么,有什么办法让我只需要生成@Str一次吗? [这可以通过使用PATINDEX]

来实现

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

测试用例

  1. Search Text达卡Result 1
  2. Search Text tal Result 0
  3. Search Text Mirpur Result 0
  4. Search TextResult 0
  5. Search TextResult 7
  6. Search Text达卡资本Result 0

2 个答案:

答案 0 :(得分:1)

要在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

答案 1 :(得分:1)

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

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

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