SQL 从已知字符串中查询 select 两个子字符串
A SQL Query to select two substrings from a known string
我需要一个 SQL 查询从一个主字符串中获取两个字符串,返回值以 T#######@@###@@####
开头。主串长度变化
示例:
主串
@code=025121710TestPASS*68242850AD*68242382AF*1UJ97DX9AF*68248793AB*68236772AB*56054275AG*NoPN*1UW38DX9ACNoPNT00BE161571394 *T8LQI141529458*NoPNNoPNNoPN*NoPN
捕获的第一个子字符串
T00BE161571394
捕获的第二个子字符串
T8LQI141529458
到目前为止我已经想到了这个,但无济于事:
捕获的第一个子字符串
SELECT left(RIGHT(code, 51), 15)
捕获的第二个子字符串
SELECT left(RIGHT(code, 35), 15)
有人可以帮助我吗?我不确定如何正确计算长度并以正确的顺序分隔子字符串。
我猜你可以用[*]分隔。反转字符串并拆分
declare @string1 nvarchar(250)
declare @string2 nvarchar(250)
declare @myString nvarchar(500)= '025121710TestPASS*68242850AD*68242382AF*1UJ97DX9AF*68248793AB*68236772AB*56054275AG*NoPN*1UW38DX9ACNoPNT00BE161571394 *T8LQI141529458*NoPNNoPNNoPN*NoPN'
set @myString = REVERSE(@myString)
DECLARE @StartPos int, @Length int
select @StartPos = CHARINDEX('*', @myString)
set @myString = SUBSTRING(@myString,(@StartPos+1),len(@myString)-@StartPos)
select @StartPos = CHARINDEX('*', @myString)
set @myString = SUBSTRING(@myString,(@StartPos+1),len(@myString)-@StartPos)
select @StartPos = CHARINDEX('*', @myString)
select @string1 = SUBSTRING(@myString,0,@StartPos)
set @myString = SUBSTRING(@myString,(@StartPos+1),len(@myString)-@StartPos)
select @StartPos = CHARINDEX('*', @myString)
select @string2 = SUBSTRING(@myString,0,16)
select REVERSE(@string1) ,REVERSE(@string2)
试试这个,这将 select 完整的主字符串中的子字符串列表
declare @myString nvarchar(500)= '025121710TestPASS*68242850AD*68242382AF*1UJ97DX9AF*68248793AB*68236772AB*56054275AG*NoPN*1UW38DX9ACNoPNT00BE161571394 *T8LQI141529458*NoPNNoPNNoPN*NoPN'
;with T(ind,pos) as (
select charindex('T', @myString), 1
union all
select charindex('T', substring(@myString,ind+1,len(@myString)))+ind,pos+1
from t
where pos > 0 and ind <> charindex('T', substring(@myString,ind+1,len(@myString)))+ind
)
select substring(@myString,ind,14) as YourString from t where substring(@myString,ind,14) NOT LIKE '%[^a-zA-Z0-9]%'
我需要一个 SQL 查询从一个主字符串中获取两个字符串,返回值以 T#######@@###@@####
开头。主串长度变化
示例:
主串
@code=025121710TestPASS*68242850AD*68242382AF*1UJ97DX9AF*68248793AB*68236772AB*56054275AG*NoPN*1UW38DX9ACNoPNT00BE161571394 *T8LQI141529458*NoPNNoPNNoPN*NoPN
捕获的第一个子字符串
T00BE161571394
捕获的第二个子字符串
T8LQI141529458
到目前为止我已经想到了这个,但无济于事:
捕获的第一个子字符串
SELECT left(RIGHT(code, 51), 15)
捕获的第二个子字符串
SELECT left(RIGHT(code, 35), 15)
有人可以帮助我吗?我不确定如何正确计算长度并以正确的顺序分隔子字符串。
我猜你可以用[*]分隔。反转字符串并拆分
declare @string1 nvarchar(250)
declare @string2 nvarchar(250)
declare @myString nvarchar(500)= '025121710TestPASS*68242850AD*68242382AF*1UJ97DX9AF*68248793AB*68236772AB*56054275AG*NoPN*1UW38DX9ACNoPNT00BE161571394 *T8LQI141529458*NoPNNoPNNoPN*NoPN'
set @myString = REVERSE(@myString)
DECLARE @StartPos int, @Length int
select @StartPos = CHARINDEX('*', @myString)
set @myString = SUBSTRING(@myString,(@StartPos+1),len(@myString)-@StartPos)
select @StartPos = CHARINDEX('*', @myString)
set @myString = SUBSTRING(@myString,(@StartPos+1),len(@myString)-@StartPos)
select @StartPos = CHARINDEX('*', @myString)
select @string1 = SUBSTRING(@myString,0,@StartPos)
set @myString = SUBSTRING(@myString,(@StartPos+1),len(@myString)-@StartPos)
select @StartPos = CHARINDEX('*', @myString)
select @string2 = SUBSTRING(@myString,0,16)
select REVERSE(@string1) ,REVERSE(@string2)
试试这个,这将 select 完整的主字符串中的子字符串列表
declare @myString nvarchar(500)= '025121710TestPASS*68242850AD*68242382AF*1UJ97DX9AF*68248793AB*68236772AB*56054275AG*NoPN*1UW38DX9ACNoPNT00BE161571394 *T8LQI141529458*NoPNNoPNNoPN*NoPN'
;with T(ind,pos) as (
select charindex('T', @myString), 1
union all
select charindex('T', substring(@myString,ind+1,len(@myString)))+ind,pos+1
from t
where pos > 0 and ind <> charindex('T', substring(@myString,ind+1,len(@myString)))+ind
)
select substring(@myString,ind,14) as YourString from t where substring(@myString,ind,14) NOT LIKE '%[^a-zA-Z0-9]%'