sql - 需要解析数据
问题描述
我正在尝试从字符串中解析出某些数据,但我遇到了问题。
这是字符串: 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
解决方案
如果您正在解析,我们是否可以假设您不知道 '^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
推荐阅读
- python - 超过最大重试次数
- google-sheets - 匿名共享 Google 表格
- android-studio - 解决错误“app:mergeDebugResources”和“文件名必须以 XML 结尾”
- nginx - Kubernetes Ingress Nginx 服务:AWS API Gateway/CloudFront 返回 403
- node.js - Winston Logger - 为控制台传输排除日志到 syslog
- flutter - Flutter:我想在屏幕上一起显示“Grid View”和其他小部件
- java - Fortify 最终抛出内部错误
- azure - Azure API 管理 - 内部且只能由 Azure 应用程序网关访问?
- amazon-cloudformation - 尝试删除参数时出现 lambda 错误
- git - 在 github 上添加项目只添加了一个目录,而尝试推送其他目录给我带来了问题