有个表里有node字段,这个node 包含多个@字段,现在要求基数的@变成1,偶数的@变成2,需求就是这样...
建表语句如下
with tb(node)as(
select 'asd@@@zxc' union
select 'zxcasd' union
select '@@@@@' union
select 'a@b@c@d')
select * from tb
/* 实现的结果如下
asd@@@zxc asd121zxc
@@@@@ 12121
a@b@c@d a1b2c1d
zxcasd zxcasd
*/
------解决方案--------------------
看来只能用WHILE循环写了 while <=LEN(NODE) 然后一个字母一个字母的判断。
------解决方案--------------------
charindex返回字符串中指定表达式的起始位置,你拿到了index无论判断奇偶数还是替换不都能做了吗,替换了第一个再循环回来找下一个@,如此循环
------解决方案--------------------
with t1(node)as(
select 'asd@@@zxc' union
select 'zxcasd' union
select '@@@@@' union
select 'a@b@c@d'),
t2 AS (
select node,SUBSTRING(node,number,1) val,
CASE WHEN SUBSTRING(node,number,1)='@' THEN 1 END grp,
ROW_NUMBER() OVER(PARTITION BY node ORDER BY node) id
FROM t1,master..spt_values
WHERE type='p' AND number BETWEEN 1 AND LEN(node)
),
t3 AS (
SELECT node,id,
(ROW_NUMBER() OVER(PARTITION BY node ORDER BY node))%2 rn
FROM t2 WHERE grp=1
)
SELECT a.node,
(SELECT ''+CASE WHEN (b.val='@' AND c.rn=1) THEN '1'
WHEN (b.val='@' AND c.rn=0) THEN '2'
ELSE b.val END
FROM t2 b LEFT JOIN t3 c ON b.id=c.id AND b.node=c.node WHERE b.node=a.node FOR XML PATH('')
)
FROM t1 a
随便写的,等楼下大神出现
------解决方案--------------------
with tb(node)as(
select 'asd@@@zxc' union
select 'zxcasd' union
select '@@@@@' union
select 'a@b@c@d')
select replace(replace(node,'@@','12'),'@','1') from tb
笨办法,求破