【问题标题】:Find Substring in SQL在 SQL 中查找子字符串
【发布时间】:2019-11-13 03:12:13
【问题描述】:

我必须找到子字符串如下。

数据如下


aaaa.bbb.ccc.dddd.eee.fff.ggg 

qq.eeddde.rrr.t.hh.jj.jj.hh.hh 

ee.r.t.y.u.i.ii.

我想要输出为-


bbb

eeeddde

r

我面临的挑战是都有 (.) 作为分隔符,所以子字符串很难工作。

SELECT SUBSTRING(string,CHARINDEX('.',string)+1,
       (((LEN(string))-CHARINDEX('.', REVERSE(string)))-CHARINDEX('.',string))) AS Result 
  FROM [table] 

bbb

eeeddde

r

查找第一个和第二个 (.) 之间的子字符串

那么它可能在第二个和第三个 (.) 之间

【问题讨论】:

  • 请标记您的数据库
  • 你怎么知道它是在第 1 和第 2 点之间还是在第 3 和第 4 点之间?

标签: sql sql-server substring


【解决方案1】:

这是一种方法:

select left(v.str1, charindex('.', v.str1 + '.') - 1)
from t cross apply
     (values (stuff(t.string, 1, charindex('.', t.string + '.'), '')
     ) v(str1)

【讨论】:

    【解决方案2】:

    我假设 (CHARINDEX) 这是 ms sql server。 CROSS APPLY 便于中间计算。

    SELECT t.pos, t1.pos,
      SUBSTRING(string, t.pos + 1, t1.pos - t.pos -1) AS Result 
    FROM [table]
    CROSS APPLY ( VALUES(CHARINDEX('.',string)) ) t(pos) 
    CROSS APPLY ( VALUES(CHARINDEX('.',string, t.pos+1))) t1(pos) 
    

    【讨论】:

      【解决方案3】:

      另一种选择是使用一点 XML

      示例

      Declare @YourTable table (ID int,SomeColumn varchar(max))
      Insert Into @YourTable values
       (1,'aaaa.bbb.ccc.dddd.eee.fff.ggg')
      ,(2,'qq.eeddde.rrr.t.hh.jj.jj.hh.hh')
      ,(3,'ee.r.t.y.u.i.ii.')
      
      
      Select ID
            ,SomeValue = convert(xml,'<x>' + replace(SomeColumn,'.','</x><x>')+'</x>').value('/x[2]','varchar(100)')
       From @YourTable
      

      退货

      ID  SomeValue
      1   bbb
      2   eeddde
      3   r
      

      【讨论】:

        【解决方案4】:

        您可以同时使用left()replace()charindex() 函数:

        select replace(
                replace(
                       left(str,charindex('.',str,charindex('.',str)+1)),
                       left(str,charindex('.',str)),
                       ''
                       ),
                       '.'
                       ,''
                      ) as "Output"
          from t;
        

        Demo

        【讨论】:

        • 如果我必须找出介于 2 和 3rd 之间的字符串,我该怎么办?
        • @Andrew 在这种情况下考虑两步 solution
        • 谢谢巴巴罗斯。无法弄清楚这一点。我在 str 中输入了列名,但没有运气。
        • 如果我必须在第 4 和第 5 之间找到子字符串,最好怎么办......事情变得越来越复杂。我必须根据第三个和第四个(。)中存在的某些字符来更新另一个。将来它可能在第 4 和第 5 (.) 之间。您想到的任何其他简单解决方案都会有所帮助
        • 嗨@Andrew。作为一个 Oracle 人,我也觉得整个 SQL Server 中缺少一些正则表达式操作。在这类问题中,我们主要使用charindex(),它没有occurence 参数。出于这个原因,不幸的是,提取子字符串的过程主要依赖于硬编码。如果您的字符串有两个或三个点,您将能够使用parsename() 函数轻松提取所需的子字符串。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-13
        • 1970-01-01
        • 2021-08-13
        • 2015-10-28
        相关资源
        最近更新 更多