在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值可能很长 p>
由于
答案 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}}以接收分隔符作为参数。