需要解析数据

时间:2018-04-27 15:37:53

标签: 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。"

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

4 个答案:

答案 0 :(得分:1)

如果你正在解析,我们可以假设你不知道在' ^ 14 ='之后可能会发生什么,但是你需要捕捉到什么呢?因此,搜索特定的字符串不会起作用,因为在' ^ 14 ='之后可能会发生任何事情。最好的方法是确定最长的可靠特定字符串,为您提供立足点#34;找到您正在寻找的数据。你不想做的是,如果' ^ 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

答案 1 :(得分:0)

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

示例:

CopyLoop - OnPreDataItem()
NoOfLoops := 1 + ABS(NoOfCopies);
CopyText := '';
SETRANGE(Number,1,NoOfLoops);
OutputNo := 1;

CopyLoop - OnAfterGetRecord()
IF Number > 1 THEN BEGIN
  CopyText := Text001;
  OutputNo += 1;
END;
CurrReport.PAGENO := 1;
TotalQty := 0;           // Item Tracking

CopyLoop - OnPostDataItem()


PageLoop - OnPreDataItem()
// Item Tracking:
IF ShowLotSN THEN BEGIN
  TrackingSpecCount := 0;
  OldRefNo := 0;
  ShowGroup := FALSE;
END;

PageLoop - OnAfterGetRecord()

PageLoop - OnPostDataItem()

这     #T1

答案 2 :(得分:0)

您可以使用此查询(假设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;

<强>插图:

create table parsetest (item varchar(5000));

insert into parsetest 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');

select * from parsetest;
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| item                                                                                                                                                                                                                               |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 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 |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

select SUBSTR(item, LOCATE('REP',item), LOCATE('REPRGR.',item) + LENGTH('REPRGR.') - LOCATE('REP', item)) info_msg from parsetest;
+------------------------------------------------------+
| info_msg                                             |
+------------------------------------------------------+
| REP NOT FOUND ON REP TABLE, CANNOT INSERT TO REPRGR. |
+------------------------------------------------------+

答案 3 :(得分:0)

听起来你正试图获得参数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 

在此处试试:http://sqlfiddle.com/#!18/22f23/2

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

注意事项:如果^之后没有参数(^14=),则无效。同样,如果没有^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')