【问题标题】:Retrieve several words in the string in T-SQL在 T-SQL 中检索字符串中的几个单词
【发布时间】:2017-04-13 03:24:36
【问题描述】:

我有一个像'(ST1) today is Tuesday,(ST2)--CCC,yao (ST3)'这样的字符串。我想检索所有以ST开头的单词,然后插入到临时表中。在这种情况下,临时表将有 3 行,包括 ST1、ST2 和 ST3。有没有什么好的方法可以实现这个目标?谢谢你。我使用的是 SQL Server 2008,而 T-SQL 是我的语言。

【问题讨论】:

  • 用词定义你的意思。你怎么知道一个“词”在哪里开始和结束。
  • 所需值是否位于左括号和右括号之间?
  • @SeanLange 抱歉,我没有明确提及。左括号和尾括号之间应该有一个单词。
  • @ahmedab​​delqader 是的,你是对的。
  • 那看看我的回答。鉴于您的样本,这就是我认为的情况。

标签: sql sql-server tsql


【解决方案1】:

假设每个“单词”都是括号之间的内容,您可以很容易地使用字符串拆分器。我正在使用来自 sql server central.com 的 Jeff Moden 的拆分器。你可以在这里找到一篇文章、讨论和代码。 http://www.sqlservercentral.com/articles/Tally+Table/72993/

还有很多其他出色的分离器。 Aaron Bertrand 在这里有一篇很棒的文章和它们的集合。 http://sqlperformance.com/2012/07/t-sql-queries/split-strings

declare @SomeString varchar(100) = '(ST1) today is Tuesday,(ST2)--CCC,yao (ST3)'

select s.Item
from dbo.DelimitedSplit8K(replace(@SomeString, ')', '('), '(') s
where Item like 'ST%'

【讨论】:

    【解决方案2】:

    您也可以获取NGrams8K 的副本并执行以下操作:

    DECLARE @yourstring varchar(100) = '(ST1) today is Tuesday,(ST2)--CCC,yao (ST3)';
    
    SELECT item = SUBSTRING(token, 2, 3)
    FROM dbo.NGrams8k(@yourstring, 5)
    WHERE token LIKE '(%)';
    

    编辑:如何处理大于 3 的值:

    DECLARE @yourstring varchar(100) = '(ST1) today is Tuesday,(ST2)--CCC,yao (ST11)!! (ST999)';
    
    WITH gramSizes(s,ng) AS (SELECT 3, 5 UNION ALL SELECT 4, 6 UNION ALL SELECT 5, 7)
    SELECT item = SUBSTRING(token, 2, s)
    FROM gramSizes
    CROSS APPLY dbo.NGrams8k(@yourstring, ng)
    WHERE token LIKE '(%)'AND token NOT LIKE '%) '
    

    结果:

    item
    -----
    ST1
    ST2
    ST11
    ST999
    

    【讨论】:

    • 艾伦真聪明。不知道我是怎么错过你的文章的,但我肯定会添加到我的工具箱中!!这里唯一的缺点是如果“单词”超过 3 个字符,则不会返回它们。但是,如果所有单词都恰好是 3 个字符,则此方法可行并且执行计划要简单得多。
    • 也感谢您的帮助。艾伦
    • 不客气艾弗森。肖恩 - 谢谢你的客气话。我的意思是包含一个超过 3 的值的示例。我刚刚更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2022-01-02
    • 2015-05-21
    • 1970-01-01
    • 2013-10-22
    • 2014-05-30
    • 2013-09-15
    • 2015-08-17
    • 1970-01-01
    相关资源
    最近更新 更多