4

在 Sql 服务器中

我有一个以下字符串

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 值可能很长

谢谢

4

3 回答 3

2

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

select string from CommaSplit(@srch,'') where string  in (select * from CommaSplit(@srch)
于 2013-10-28T06:21:04.523 回答
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
于 2013-10-28T06:13:05.623 回答
0

我不认为 IN 子句是你需要的。取而代之的是,您可以使用 LIKE 结构,如下所示:

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

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

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

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

于 2013-10-28T06:21:17.367 回答