SQL检查字符串是否包含Where子句

4
在Sql Server中,我有以下字符串:
我有一个以下的字符串:
DECLARE @str nvarchar(max);
set @str = "Hello how are you doing today,Its Monday and 5 waiting days";

DECLARE @srch nvarchar(max);
set @srch = " how,doing,monday,waiting";

现在我想检查字符串(str)是否包含(srhc)中的任何一个字符串(以逗号分隔)

我只想在SQL Server中实现

有没有可能使用in子句编写一些查询

比如

select from @str where _____  in (select * from CommaSplit(@srch)

CommaSplit函数返回@srch逗号分隔值的行。

由于@srch的值可能非常长,因此我不想使用游标或任何循环概念。

谢谢。


请查看此链接:http://stackoverflow.com/questions/19584865/declare-multiple-value-variable-in-sql/19585026?noredirect=1#comment29068637_19585026 - Vijay Hulmani
如果 @srch 很长,最好使用循环概念而不是尝试使用 in。使用循环可以编写一个函数,将字符串拆分为表格结果,然后连接到该结果中。这样可以获得更好的灵活性和可能的优化性能。 - Allan S. Hansen
3个回答

2
您可以使用同样的函数来获取行中的第一个字符串。
select string from CommaSplit(@srch,'') where string  in (select * from CommaSplit(@srch)

只有在@srch变量中的字符串也用逗号分隔时,此方法才有效。否则结果将不正确... - Sandr
谢谢,它起作用了,因为我控制着srch字符串,但我认为你误解了@srch的第一次出现应该是str。 - M Akela

0

您可以使用以下常用表达式查询将字符串拆分为多个部分。 cte 将包含每个在 @srch 中的短语的一条记录。在下面的示例中,我展示了搜索短语在 @str 中的位置。如果无法定位搜索短语,则返回 0。

注意1:如果您的搜索短语重复,它不会显示位置两次 - 您需要另一个 CTE。

注意2:我必须在 @srch 的末尾添加逗号才能使我的 CTE 正常工作。如果您不想更改搜索字符串,可以在 CTE 内部执行此操作。

DECLARE @str nvarchar(max);
set @str = 'Hello how are you doing today,Its Monday and 5 waiting days';

DECLARE @srch nvarchar(max);
set @srch = 'how,doing,monday,waiting';

set @srch = @srch + ','

-- first split the text into 1 character per row
;with cte
as
(
    select substring(@srch, 1, CHARINDEX(',', @srch, 1) - 1) as Phrase, CHARINDEX(',', @srch, 1) as Idx

    union all

    select substring(@srch, cte.Idx + 1, CHARINDEX(',', @srch, cte.Idx + 1) - cte.Idx - 1) as Phrase, CHARINDEX(',', @srch, cte.Idx + 1) as Idx
    from cte
    where cte.Idx < CHARINDEX(',', @srch, cte.Idx + 1)
)

select charindex(cte.Phrase, @str, 1) from cte

0

我认为IN子句不是你所需要的。你可以使用以下LIKE结构:

 if (select count(*) from CommaSplit(@srch) where @str like '%' + val + '%') > 0
      select 'true'
 else
      select 'false'

在这种情况下,当CommaSplit函数的至少1个结果存在于@str文本中时,您将收到'true'。但是,在这种情况下,当CommaSplit函数的结果是@str字符串中单词的一部分时,您也将收到'true'值。
如果您需要更准确的解决方案,可以通过以下方式实现:您需要将@str拆分为单词(事先还需将标点符号替换为空格)。然后,CommaSplit (@srch)SpaceSplit(@str)的交集将是问题的答案。此外,您还将能够检查两个字符串之间匹配的单词。
这种方法的开销是创建SpaceSplit函数,它是CommaSplit的副本,但具有另一个分隔符。或者,可以修改CommaSplit函数以接收分隔符作为参数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接