当前位置: 代码迷 >> Sql Server >> 一个sql.解决思路
  详细解决方案

一个sql.解决思路

热度:10   发布时间:2016-04-24 10:09:04.0
一个sql...
有个表里有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



笨办法,求破
  相关解决方案