SQL解析字符串

SQL解析字符串,sql,sql-server,substring,charindex,Sql,Sql Server,Substring,Charindex,有人能告诉我哪里出错了,我似乎无法提取第四个单词CCC,尝试了所有方法,不想将其放入表中,只需返回select中的子字符串 DECLARE@ProductCode VARCHAR(256) SET@ProductCode='CCCC-ddddd-AAA-CCC-BBBBB' 选择左侧(@ProductCode,CHARINDEX('-',@ProductCode)-1)作为CHAR1, 子字符串(@ProductCode,CHARINDEX('-',@ProductCode)+1, CHARIN

有人能告诉我哪里出错了,我似乎无法提取第四个单词CCC,尝试了所有方法,不想将其放入表中,只需返回select中的子字符串

DECLARE@ProductCode VARCHAR(256)
SET@ProductCode='CCCC-ddddd-AAA-CCC-BBBBB'
选择左侧(@ProductCode,CHARINDEX('-',@ProductCode)-1)作为CHAR1,
子字符串(@ProductCode,CHARINDEX('-',@ProductCode)+1,
CHARINDEX('-',@ProductCode,CHARINDEX('-',@ProductCode)+1)-(CHARINDEX('-',@ProductCode)+1))作为CHAR2,
子字符串(@ProductCode,CHARINDEX('-',@ProductCode,CHARINDEX('-',@ProductCode)+1)+1,
数据长度(@ProductCode)-CHARINDEX('-',@ProductCode,CHARINDEX('-',@ProductCode)+1)-CHARINDEX('-',反向(@ProductCode)),作为CHAR3,
子字符串(@ProductCode,CHARINDEX('-',@ProductCode,CHARINDEX('-',@ProductCode),CHARINDEX('-',@ProductCode)+1))+1,
数据长度(@ProductCode)-CHARINDEX('-',@ProductCode,CHARINDEX('-',@ProductCode),CHARINDEX('-',@ProductCode)+1)-CHARINDEX('-',反向(@ProductCode)),作为CHAR4,
右(@ProductCode,CHARINDEX('-',反向(@ProductCode))-1)为LASTCHAR
去

非常感谢

也许更简单一些:

select s.value
from string_split(@productcode, '-') s
where @productcode like '%-%-%-' + s.value + '-%' and
      @productcode not like '%-%-%-%-' + s.value + '-%' and

  
以下是完成任务的一种方法:

使用多种方法提取数据会让您感到困惑 一串您不需要反向函数来获得字符串的结尾 ,您可以使用charindex继续提取“-”的位置 函数并从字符串的总长度中减去它

——获取第三个和第四个单词(与第二个单词相同)
声明@ProductCode VARCHAR(256)
设置@ProductCode='CC12CC-DDD34DD-A56A-C78C-BB910BB'
选择左侧(@ProductCode,CHARINDEX('-',@ProductCode)-1)作为CHAR1,
子字符串(@ProductCode,CHARINDEX('-',@ProductCode)+1,
CHARINDEX('-',@ProductCode,CHARINDEX('-',@ProductCode)+1)-(CHARINDEX('-',@ProductCode)+1))作为CHAR2,
子串(
@产品代码,
--…从第二个“-”加上一的位置开始
CHARINDEX('-',@ProductCode,CHARINDEX('-',@ProductCode)+1)+1,
--第二个和第三个“-”之间的字符数
CHARINDEX('-',@ProductCode,CHARINDEX('-',@ProductCode,CHARINDEX('-',@ProductCode)+1)+1)-1--3“-”减1
---减去第二位“-”
CHARINDEX('-',@ProductCode,CHARINDEX('-',@ProductCode)+1)--=第二个和第三个“-”之间的字符
)作为xCHAR3,
子串(
@产品代码,
--..从第三个“-”位置加上一
CHARINDEX('-',@ProductCode,CHARINDEX('-',@ProductCode,CHARINDEX('-',@ProductCode)+1)+1,
--获得尽可能多的第三和第四个“-”之间的字符
CHARINDEX('-',@ProductCode,CHARINDEX('-',@ProductCode,CHARINDEX('-',@ProductCode,CHARINDEX('-',@ProductCode)+1)+1)-1--4“-”减1
---减去第三位“-”
CHARINDEX('-',@ProductCode,CHARINDEX('-',@ProductCode,CHARINDEX('-',@ProductCode)+1)+1)--=介于第3和第4“-”之间的字符
)作为xCHAR4,
右(@ProductCode,CHARINDEX('-',反向(@ProductCode))-1)为LASTCHAR
去
--... 或
声明@ProductCode VARCHAR(256);
SET@ProductCode='CC12CC-DDD34DD-A56A-C78C-BB910BB';
挑选
p、 值('comment()[1]','varchar(100)')作为char1,
p、 值('comment()[2]','varchar(100)')作为char2,
p、 值('comment()[3]','varchar(100)')作为char3,
p、 值('comment()[4]','varchar(100)')作为char4,
p、 值('comment()[5]','varchar(100)')作为char5
从…起
(
--在“-”上拆分xml注释是相当安全的
选择强制转换(“”为xml)p
)as-t;

这种方法的优点是可读性强,但很难看

DECLARE  @ProductCode VARCHAR(256) 

SET @ProductCode = 'CCCC-DDDDDDD-AAA-CCC-BBBBB' 

select @ProductCode = substring(@ProductCode,charindex('-',@ProductCode)+1,99)
select @ProductCode = substring(@ProductCode,charindex('-',@ProductCode)+1,99)
select @ProductCode = substring(@ProductCode,charindex('-',@ProductCode)+1,99)
select @ProductCode = left(@ProductCode,charindex('-',@ProductCode)-1)

select @ProductCode

这种方法的优点是灵活,你可以改变第n个单词

declare @ProductCode varchar(256) 
declare @WordSought int = 4
declare @Cntr int = 0

set @ProductCode = 'CCCC-DDDDDDD-AAA-CCC-BBBBB' 

while @cntr < @WordSought - 1
begin
    select @ProductCode = substring(@ProductCode,charindex('-',@ProductCode)+1,99)
    set @cntr = @cntr + 1
end

select left(@ProductCode,charindex('-',@ProductCode + '-') - 1)
declare@ProductCode varchar(256)
声明@WordSeek int=4
声明@Cntr int=0
set@ProductCode='CCCC-ddddd-AAA-CCC-BBBBB'
而@cntr<@wordseek-1
开始
选择@ProductCode=substring(@ProductCode,charindex('-',@ProductCode)+1,99)
设置@cntr=@cntr+1
结束
选择左侧(@ProductCode,charindex('-',@ProductCode+'-')-1)

帮个忙,找到一个提供序号位置的字符串拆分函数。在某种程度上,MS将改进内置函数以实现同样的功能。添加TRIM只花了17年时间,而使用datalength在逻辑上是不正确的。如果您需要处理nvarchar字符串,则代码将无法工作。您试图提取的字符串是否始终位于同一位置?string_SPLIT要求兼容级别至少为130@JohnJoseph . . . 或者换一种说法,从2016-06-01的最新版本开始,它就已经面世了——大约四年半了。所以,假设你是在尽力帮助别人,而不是小题大做。。。如果OP具有SQL Server 2014或更早版本,则无法将兼容性更改为130或更高版本。
DECLARE  @ProductCode VARCHAR(256) 

SET @ProductCode = 'CCCC-DDDDDDD-AAA-CCC-BBBBB' 

select @ProductCode = substring(@ProductCode,charindex('-',@ProductCode)+1,99)
select @ProductCode = substring(@ProductCode,charindex('-',@ProductCode)+1,99)
select @ProductCode = substring(@ProductCode,charindex('-',@ProductCode)+1,99)
select @ProductCode = left(@ProductCode,charindex('-',@ProductCode)-1)

select @ProductCode
declare @ProductCode varchar(256) 
declare @WordSought int = 4
declare @Cntr int = 0

set @ProductCode = 'CCCC-DDDDDDD-AAA-CCC-BBBBB' 

while @cntr < @WordSought - 1
begin
    select @ProductCode = substring(@ProductCode,charindex('-',@ProductCode)+1,99)
    set @cntr = @cntr + 1
end

select left(@ProductCode,charindex('-',@ProductCode + '-') - 1)