【问题标题】:T-SQL Split String Like ClauseT-SQL 拆分字符串类似子句
【发布时间】:2011-11-09 04:25:30
【问题描述】:

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

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

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

【问题讨论】:

标签: sql


【解决方案1】:

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

无论如何,我将使用下面的代码(我在 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)

【讨论】:

  • 测试一下看看。如果您得到不理解的结果,请再问一个问题。
【解决方案2】:

使用函数将单个项目拆分为一个表,每个项目一条记录。然后您只需加入该表即可。

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

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

当然我的例子是使用相等。如果您真的打算将“like”与通配符一起使用,情况会变得更加复杂。

【讨论】:

    【解决方案3】:

    在 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

    【讨论】:

    • 注意:这匹配单个字符。如果你想匹配单词,这是行不通的。
    • 我认为你成功了。让我深入了解一下。谢谢。您如何看待我基于 xml 的肮脏技术?
    • 我个人会做split-to-table功能,但我从来没有真正在sql server中使用过xml变量,所以我不能说哪个更快。
    【解决方案4】:

    最多 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'
    

    【讨论】:

      猜你喜欢
      • 2014-03-13
      • 1970-01-01
      • 2021-06-23
      • 2014-01-25
      • 2011-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多