检查以特定字符串 [SQL Server] 开头的单词
Check a word starting with specific string [SQL Server]
我尝试搜索像 Dhaka is the capital of Bangladesh
这样包含六个单词的字符串。如果我的搜索文本是 cap
(这是大写的起始文本),它会给我字符串中搜索文本的起始索引(这里是 14)。如果搜索文本包含在字符串中但不包含任何单词的起始文本,它将给我 0。请查看 Test Case 以便更好地理解。
我试过的
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 子句中使用它。
测试用例
Search Text
: 达卡, Result
: 1
Search Text
: 合计, Result
: 0
Search Text
: 米尔布尔, Result
: 0
Search Text
: 是, Result
: 0
Search Text
:是,Result
:7
Search Text
: 达卡首都, Result
: 0
要在 SELECT 中每行只计算一次函数,使其成为 table 值函数。或者如果由于某种原因不可能使用 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
只需在字符串中添加前导 space 即可确保您始终只找到单词的开头:
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
我已经针对您的测试用例测试了上述查询,它似乎有效。
我尝试搜索像 Dhaka is the capital of Bangladesh
这样包含六个单词的字符串。如果我的搜索文本是 cap
(这是大写的起始文本),它会给我字符串中搜索文本的起始索引(这里是 14)。如果搜索文本包含在字符串中但不包含任何单词的起始文本,它将给我 0。请查看 Test Case 以便更好地理解。
我试过的
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 子句中使用它。
测试用例
Search Text
: 达卡,Result
: 1Search Text
: 合计,Result
: 0Search Text
: 米尔布尔,Result
: 0Search Text
: 是,Result
: 0Search Text
:是,Result
:7Search Text
: 达卡首都,Result
: 0
要在 SELECT 中每行只计算一次函数,使其成为 table 值函数。或者如果由于某种原因不可能使用 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
只需在字符串中添加前导 space 即可确保您始终只找到单词的开头:
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
我已经针对您的测试用例测试了上述查询,它似乎有效。