Sql 需要解析数据吗

Sql 需要解析数据吗,sql,Sql,我试图从字符串中解析出某些数据,但遇到了一些问题 以下是字符串: 1=BETA.1.0^2=175^3=812^4=R^5=N^9=1^12=1^13=00032^14=REP表中找不到REP,无法插入到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 下面是我的查询SELEC

我试图从字符串中解析出某些数据,但遇到了一些问题

以下是字符串: 1=BETA.1.0^2=175^3=812^4=R^5=N^9=1^12=1^13=00032^14=REP表中找不到REP,无法插入到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 CONVERTVARCHAR5000,CHARINDEX'14=',ColumnFROM Table

您可以尝试使用带有通配符的Case When语句来查找所需的值

例如:

SELECT 
 CASE
    WHEN x LIKE '%REP Not Found%'
        THEN 'REP NOT FOUND ON REP TABLE, CANNOT INSERT TO REPRGR'
 ELSE 
    ''
END AS x

T1

假设MySQL数据库为:

-- item is the column that contains the string
select SUBSTR(item, LOCATE('REP',item), LOCATE('REPRGR.',item) + LENGTH('REPRGR.') - LOCATE('REP', item)) info_msg from Table;
说明:


听起来你想得到论点14的值。这应该做到:

select substring(
  someData
  , charindex('^14=',someData) + 4
  , charindex('^',someData, charindex('^14=',someData) + 4) - charindex('^14=',someData) - 4
) errorMessage
from myData
where charindex('^14=',someData) > 0
and charindex('^',someData, charindex('^14=',someData) + 4) > 0 
请在此处尝试:

这将获取给定输入的子字符串。 子字符串从字符串^14=后的第一个字符开始;i、 e.我们在字符串中获得^14=的索引,然后向其中添加4以跳过匹配字符本身。 子字符串在^14=中的字符后的第一个字符处结束。我们得到该字符的索引,然后从中减去起始位置,得到所需输出的长度

注意事项:如果^14=之后没有参数^1,则此操作将不起作用。同样,如果没有^14=即使字符串从14=开始,这也将不起作用。从可用的信息来看,这是可以的;但如果这是一个问题,请说,我们可以提供一些东西来处理更复杂的情况

创建表和填充演示数据的代码

create table myData (someData nvarchar(256))
insert myData (someData) 
values ('1=BETA.1.0^2=175^3=812^4=R^5=N^9=1^12=1^13=00032^14=REP NOT FOUND ON REP TABLE, CANNOT INSERT TO REPRGR.^10=107~117~265~1114~3143~3505~3506~3513~5717^11=SA16~1~WY~WY~A~S~20100210~001~SE62^-omitted due to existing Rep Not Found')
 , ('1xx^14=something else.^10=xx')

如果您正在进行分析,我们是否可以假设您不知道“^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

您必须在SQL中执行此操作吗?你不能在你的应用程序中这样做。是的,我必须在SQL中这样做假设这是SQL Server,你没有提到你正在使用的DBMS,你需要将子字符串与CHARINDEX结合使用。。CHARINDEX只提供所讨论字符串的第一个实例的索引;MS SQL、MySQL、Postgres、Oracle等?好的,让我重新表述一下,^14=包含我需要解析的信息,但长度或字数不一致。因此,某些行将^14=无效电话号码。而其他行与上述相同。所以我几乎需要抓住^14中的任何内容=之前或之后都没有。如果这使SENSG 537,级别16,状态2,第113行传递给LEFT或SUBSTRING函数的长度参数无效。请立即尝试;您正在运行的某些数据似乎没有任何匹配项。where条件将过滤掉这些结果。
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