sql检查字符串包含where子句

时间:2013-10-28 05:26:06

标签: sql-server sql-server-2008 c#-4.0

在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是否包含srch

的任何字符串(逗号分隔的字符串)

我只想在sql server

中使用它

是否有可能使用in子句

编写一些查询

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

其中CommaSplit函数重新包含@srch逗号分隔值的行

我不想使用游标或任何循环概念,因为@srch值可能很长

由于

3 个答案:

答案 0 :(得分:2)

你可以使用相同的函数来获取行中的第一个字符串

select string from CommaSplit(@srch,'') where string  in (select * from CommaSplit(@srch)

答案 1 :(得分: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

答案 2 :(得分:0)

我不认为IN子句是你需要的。您可以使用LIKE构造,而不是这样:

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

在这种情况下,当'true'文字中至少有CommaSplit@str函数的结果时,您会收到'true'。但在这种情况下,如果CommaSplit函数的结果是@str字符串中单词的一部分,您也会收到@str值。

如果您需要更准确的解决方案,可以通过以下方式实现:您需要将CommaSplit (@srch)拆分为单词(也预先用空格替换标点符号)。在此之后,SpaceSplit(@str)SpaceSplit的交叉将成为问题的答案。其中,您还可以检查两个字符串之间匹配的单词。

此方法的开销是创建函数CommaSplit,它是CommaSplit的副本,但带有另一个分隔符。或者可以修改函数{{1}}以接收分隔符作为参数。