我正在尝试解析字符串中的某些数据而我遇到了问题。
这是字符串: 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
答案 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')