【问题标题】:Find a substring after a matched pattern in t-sql在 t-sql 中查找匹配模式后的子字符串
【发布时间】:2013-06-27 13:53:50
【问题描述】:

这可能真的很容易,但 T-SQL 远非我的强项。

我有一堆非常长的字符串,其中包含一个如下所示的段:

   ~GS^PO^007941230X^107996118^20130514^

我想从中提取 007941230X。此子字符串的长度会有所不同,但格式始终为:

  ~xxxx^.....^xxxxx^~GS^PO^jjjjjjjj^xxx^xxxx^....~

有谁知道如何在 t-sql 中获取 j 的值的子字符串?

我试图以某种方式使用 patindex,但无法弄清楚。

【问题讨论】:

  • HL7?并且,'jjjjj' 是否总是在字符串中的相同位置,其他值是否固定长度?
  • 唯一不变的是值之间的 ^ 分隔符。不幸的是,其他所有内容都不是固定长度。
  • 顺序总是一样的吗? 'GS^PO^' 是否保证始终位于您要查找的字符串之前?

标签: sql sql-server regex tsql


【解决方案1】:

如果字符串总是从第 8 位开始,然后长度变化,你可以这样做:

with t as (
      select '~GS^PO^007941230X^107996118^20130514^' as val
     )
select substring(val, 8, 
                 charindex('^', substring(val, 8, len(val)))-1
                )
from t;

如果你不知道它从第 8 个字符开始,你可以通过计算值来做到。这是一个带有子查询的示例:

with t as (
      select '~GS^PO^007941230X^107996118^20130514^' as val
     )
select substring(val, start, 
                 charindex('^', substring(val, start, len(val)))-1
                ), start
from (select charindex('^', t.val, 
                       charindex('^', t.val) +1
                      ) + 1 as start, t.*
      from t
     ) t

T-SQL 中的字符串函数不如其他语言强大。但有时需要将这样的解决方案拼凑起来。

【讨论】:

  • 感谢您的解决方案,这也有效。希望我能选择两个正确的答案。
【解决方案2】:

这是一个工作示例

declare @var varchar(1000) = '~xxxx^.....^xxxxx^~GS^PO^jjjjjjjj^xxx^xxxx^....'
declare @start_position int, @end_position int
declare @temp_string varchar(100)
select @start_position = PATINDEX('%GS^PO^%', @var)
print @start_position
select @temp_string = SUBSTRING(@var, @start_position + 6, 10000)
print @temp_string
select @end_position = PATINDEX('%^%', @temp_string)
print @end_position
print substring(@temp_string, 1, @end_position -1)

20
jjjjjjjj^xxx^xxxx^....
9
jjjjjjjj

【讨论】:

    【解决方案3】:

    从给定的 URL 获取 campid

    declare @LinkUrl nvarchar(max)='http://example.com/campid=4546&custid=Objets',
                @startPosition int,
                @endPosition int,
                @tempString nvarchar(max)
        
         select @startPosition = PATINDEX('%campid=%', @LinkUrl) 
         select @tempString = SUBSTRING(@LinkUrl, @startPosition + 7, 10000) 
         select @endPosition = PATINDEX('%&custid%', @tempString)
         select distinct substring(@tempString, 1, @endPosition -1)
        
    

    输出: 4546

    【讨论】:

      猜你喜欢
      • 2013-02-12
      • 1970-01-01
      • 2020-08-21
      • 2021-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多