T-SQL Split String Like Clause

时间:2011-11-08 19:27:27

标签: sql

我有declare @a varchar(100) = 'abc bcd cde def'。我需要的是从一个表中选择一个列,如'abc'或'bcd'或'cde'或'def'。我可以使用分割函数和while来获得我想要的东西,但在某个地方,我看到了使用replace或类似东西的智能解决方案,而我却记不起来了。

我知道我可以使用xml变量,并以这种方式解析它。但是,该值是大型过程的一部分,对我来说最好的方法是以字符串形式使用它。

我知道我可以通过构建动态sql查询来解决这个问题,但这不是我正在使用的域中的一个选项。

4 个答案:

答案 0 :(得分:1)

该死的,我只记得解决方案。这是一个黑客,一个肮脏的技巧,可以完成这项工作。

无论如何,我会使用下面的代码(我在SQL Server 2008上),这是一个好主意吗?我更喜欢肮脏的分裂。是否更具表现力?

declare @w varchar(100) = 'some word'
declare @f xml

set @f = '<word>' + replace(@w, ' ', '</word><word>') + '</word>'

select
    template.item.value('.', 'varchar(100)') as word
from @f.nodes('/word') template(item)

答案 1 :(得分:0)

在tsql中,您可以使用模式col like '[abcd]'

http://msdn.microsoft.com/en-us/library/ms179859.aspx

为了匹配多个单词(不是字母)而没有动态SQL,您必须将值放入临时表中。对于拆分函数,请尝试此页面http://www.sommarskog.se/arrays-in-sql-2005.html#iterative并查看字符串列表函数iter_charlist_to_table。

或许你正在考虑SO CEO的这个小技巧Parameterize an SQL IN clause

答案 2 :(得分:0)

使用函数将各个项目拆分为一个表,每个项目一个记录。然后你只需加入那张桌子。

insert into #FilterTable (filters)
select Items from dbo.Split(@YourFilterString)

select * 
  from YourTable yt
  join #FilterTable f on f.filters = yt.YourColumn

当然我的例子是使用平等。如果你真的打算在通配符中使用“like”,那就会变得更加复杂。

答案 3 :(得分:0)

最多4个部分

WHERE
    PARSENAME(REPLACE(@a, ' ', '.'), 1) = 'xxx'
    OR
    PARSENAME(REPLACE(@a, ' ', '.'), 2) = 'xxx'
    OR
    PARSENAME(REPLACE(@a, ' ', '.'), 3) = 'xxx'
    OR
    PARSENAME(REPLACE(@a, ' ', '.'), 4) = 'xxx'