首页 > 解决方案 > 需要解析数据

问题描述

我正在尝试从字符串中解析出某些数据,但我遇到了问题。

这是字符串: 1=BETA.1.0^2=175^3=812^4=R^5=N^9=1^12=1^13=00032^14=REP 未在 REP 表中找到,无法插入TO REPRGR.^10=107~117~265~1114~3143~3505~3506~3513~5717^11=SA16~1~WY~WY~A~S~20100210~001~SE62^-由于现有 Rep 省略未找到

我需要返回此“REP 未在 REP 表上找到,无法插入 REPRGR”。

这是我的查询SELECT CONVERT(VARCHAR(5000),CHARINDEX('14=',Column))FROM Table

标签: sql

解决方案


如果您正在解析,我们是否可以假设您不知道 '^14=' 之后会发生什么,但您需要捕获任何内容?所以搜索一个特定的字符串是行不通的,因为'^14='之后可能会有任何东西。最好的方法是确定最长的可靠特定字符串,为您提供“立足点”来查找您正在寻找的数据。如果 '^14=' 在您的字符串中出现多次,您不想做的是意外捕获错误的数据。看起来 '^' 是你的分隔符,因为我在字符串的开头看不到一个。所以你实际上是在正确的轨道上,你只需要使用 SUBSTRING 作为评论者提到的。您还需要为错误消息的结尾标识一个标记,看起来它可能是下一个出现的“^”,正确的?检查几个样本以确保这一点,并确保结束标记在开始标记之前的任何时候都不存在,否则您将收到错误消息。

SELECT CAST((SUBSTRING(Column,CHARINDEX('14=',Column,0),CHARINDEX('^',Column,CHARINDEX('14=',Column,0) + 1) - CHARINDEX('14=',Column,0))) AS VARCHAR(5000)) FROM Table

您可能需要通过 +1 或 -1 来增加或减少开始位置和结束位置以完全捕获您的错误消息。但这应该动态地获取任何长度的错误消息,前提是您对开始和结束标记持肯定态度。

我这里还有一个表值解析函数,您可以将字符串和“^”传递给它,它会返回一个数据表,其中不仅包含 14=,还包含所有内容。

CREATE   function [dbo].[fn_SplitStringByDelimeter]
(
     @list      nvarchar(8000)
    ,@splitOn   char(1)
)  
returns @rtnTable table 
(

    id int identity(1,1)
    ,value nvarchar(100)
) 
as  
    begin   
        declare @index int
        declare @string nvarchar(4000)
        select @index = 1        
        if len(@list) < 1 or @list is null  return        
       --
         while @index!= 0        
         begin        
              set @index = charindex(@splitOn,@list)        
              if @index!=0        
                    set @string = left(@list,@index - 1)        
              else        
                    set @string = @list        

              if(len(@string)>0)   
                    insert into @rtnTable(value) values(@string)        
                --
              set @list = right(@list,len(@list) - @index)        
              if len(@list) = 0 break        
         end    

        return
    end

推荐阅读