34,576
社区成员
发帖
与我相关
我的任务
分享
declare @ta table(RuleNo varchar(100),NOTE varchar(2))
insert into @ta
SELECT '***ABCU###123,***ABCU###456','A'
UNION ALL SELECT '***ABCU###123,***ABCU###456','T'
UNION ALL SELECT '***ABCU###123','B'
declare @Str varchar(50)='CFEABCU789123'
select NOTE
FROM master..spt_values as a,@ta as b
WHERE type='P'AND a.number>0 and charindex(',',','+b.RuleNo,a.number)=a.number
and @Str like replace(replace(substring(b.RuleNo,a.number,charindex(',',b.RuleNo+',',a.number)-a.number),'*','[a-zA-Z]'),'#','[0-9]')
;WITH RuleTB(RuleNo,NOTE)AS(
SELECT '***ABCU###123,***ABCU###456','A'
UNION ALL SELECT '***ABCU###123,***ABCU###456','T'
UNION ALL SELECT '***ABCU###123','B'
)
SELECT NOTE FROM RuleTB
WHERE EXISTS
(SELECT 1 FROM master..spt_values
WHERE type='P'AND number>0 AND number*14-1<=LEN(RuleNo)
AND 'CFEABCU789123' LIKE REPLACE(REPLACE(SUBSTRING(RuleNo,(number-1)*14+1,number*14-1),'#','[0-9]'),'*','[A-Z]'))
纠正一下第二种写法;WITH RuleTB(RuleNo,NOTE)AS(
SELECT '***ABCU###123,***ABCU###456','A'
UNION ALL SELECT '***ABCU###123,***ABCU###456','T'
UNION ALL SELECT '***ABCU###123','B'
)
SELECT NOTE FROM RuleTB
WHERE EXISTS
(SELECT 1 FROM master..spt_values
WHERE type='P'AND number>0 AND number*13<=LEN(RuleNo)
AND 'CFEABCU789123' LIKE REPLACE(REPLACE(SUBSTRING(RuleNo,(number-1)*14+1,number*14-1),'#','[0-9]'),'*','[A-Z]'))
;WITH RuleTB(RuleNo,NOTE)AS(
SELECT '***ABCU###123,***ABCU###456','A'
UNION ALL SELECT '***ABCU###123,***ABCU###456','T'
UNION ALL SELECT '***ABCU###123','B'
)
--以上模拟你的规则表
--以下开始查询
,CTE AS(
SELECT NOTE,RuleNo
,CAST('<V>'+REPLACE(RuleNo,',','</V><V>')+'</V>' AS XML)RuleNoS
FROM RuleTB
)
SELECT NOTE FROM CTE T1
WHERE EXISTS
(SELECT 1 FROM(SELECT N.V.value('.','VARCHAR(20)')V FROM T1.RuleNoS.nodes('/V') N(V))T2
WHERE 'CFEABCU789123' LIKE REPLACE(REPLACE(V,'#','[0-9]'),'*','[A-Z]'))