我有declare @a varchar(100) = 'abc bcd cde def'
。我需要的是从一个表中选择一个列,如'abc'或'bcd'或'cde'或'def'。我可以使用分割函数和while
来获得我想要的东西,但在某个地方,我看到了使用replace
或类似东西的智能解决方案,而我却记不起来了。
我知道我可以使用xml变量,并以这种方式解析它。但是,该值是大型过程的一部分,对我来说最好的方法是以字符串形式使用它。
我知道我可以通过构建动态sql查询来解决这个问题,但这不是我正在使用的域中的一个选项。
答案 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'