表
RuleNo NOTE
***ABCU###123,***ABCU###456 A
***ABCU###123,***ABCU###456 T
***ABCU###123 B
.....
例如,设置规则,规则之间用逗号分开,RuleNo字段中的
***ABCU###123
按约定*代表英文字母,#代表数字,其他的字符就是实际的字符,字母都是大字,使用SQL 2008,想用[A-Z][0-9]查找方法是否合理
查询字符串为
CFEABCU789123
结果应该找到3条
NOTE
A
T
B
------解决思路----------------------
;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]'))
------解决思路----------------------
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]')