当前位置: 代码迷 >> Sql Server >> *求查询特殊字符进程*
  详细解决方案

*求查询特殊字符进程*

热度:42   发布时间:2016-04-24 09:29:38.0
***求查询特殊字符过程***

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]')
    
  相关解决方案