替换问题

Pact_Alice 2015-09-16 03:22:35
WITH CET AS (
select 'C0001'PromotionCode, NULL TYPE, NULL DESC0, 'FALSE' DESC01 UNION all
select 'C0001', '买数量送百分比数量', '买数量送百分比数量', 'False' UNION all
select 'C0001', '合同金额 True 销售数量','销售数量', 'True' UNION all
select 'C0001', '合同金额 True 销售数量','合同金额', 'False'
)
SELECT *,REPLACE(TYPE,DESC0,DESC01) FROM CET
我想增加一列,列值是 将TYPE列中有DESC0列值得替换成DESC01中的值,我用replace替换达不到我想要的
...全文
152 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Pact_Alice 2015-09-22
  • 打赏
  • 举报
回复
引用 1 楼 playwarcraft 的回复:

--这样设计感觉欠妥,试试临时表更新吧

WITH CET AS (
select 'C0001'PromotionCode, NULL TYPE, NULL DESC0, 'FALSE' DESC01 UNION all
select 'C0001', N'买数量送百分比数量', N'买数量送百分比数量', 'False' UNION all
select 'C0001', N'合同金额 True 销售数量',N'销售数量', 'True' UNION all
select 'C0001', N'合同金额 True 销售数量',N'合同金额', 'False'
)

select *, DESC02 = convert(nvarchar(50),[TYPE]) into #T from CET

while (exists(select 1 from #T ,(select DESC0,DESC01 from #T) as X where charindex(X.DESC0,#T.DESC02)>0))
begin
update #T
set DESC02 = replace(#T.DESC02,X.DESC0,X.DESC01)
from #T,(select DESC0,DESC01 from #T) as X
where charindex(X.DESC0,#T.DESC02)>0
end

select * from #T
/*
C0001 NULL NULL FALSE NULL
C0001 买数量送百分比数量 买数量送百分比数量 False False
C0001 合同金额 True 销售数量 销售数量 True False True True
C0001 合同金额 True 销售数量 合同金额 False False True True
*/
drop table #T


用了您的方法,今天测试时候发现一个问题,就是需要分组,
--根据PromotionCode与 CustomerCode进行分组的,更新出现问题
WITH cet AS (

select 'C0001'PromotionCode, 1036000 CustomerCode, NULL DESC0, 'FALSE' DESC1, NULL TYPE UNION ALL
select 'C0001', 1036000, '买数量送百分比数量', 'False', '买数量送百分比数量' UNION ALL
select 'C0001', 1036000, '销售数量', 'True', '合同金额 and 销售数量' UNION ALL
select 'C0001', 1036000, '合同金额', 'False' ,'合同金额 and 销售数量' UNION ALL
select 'C0002', 1036000, '发票金额', 'False', '发票金额' UNION ALL
select 'C0002', 1036000, '买金额送金额', 'False' ,'买金额送金额' UNION ALL
select 'P201506080005', 1036000, '买金额送金额', 'False', '买数量送数量 and 买金额送金额,买数量送数量 and 买数量送数量'UNION ALL
select 'P201506080005', 1036000, '买数量送数量', 'False', '买数量送数量 and 买金额送金额,买数量送数量 and 买数量送数量'UNION ALL
select 'P201506080005', 1036000, '买数量送数量', 'False' , '买数量送数量 and 买金额送金额,买数量送数量 and 买数量送数量'UNION ALL
select 'P201506080005', 1036000, NULL, 'False', NULL UNION ALL
select 'P201506080005', 1036000, NULL, 'False', NULL UNION ALL
select 'P201506080005', 1036000, NULL, 'False', NULL UNION ALL
select 'P201506080005', 1036000, NULL, 'False', NULL UNION ALL
select 'P201506080005', 1036000, '销售数量', 'True', '发票金额 and 销售数量,销售金额 or 发票金额' UNION ALL
select 'P201506080005', 1036000, '销售金额', 'True', '发票金额 and 销售数量,销售金额 or 发票金额' UNION ALL
select 'P201506080005', 1036000, '发票金额', 'True', '发票金额 and 销售数量,销售金额 or 发票金额'
)
select *, DESC02 = convert(nvarchar(50),[TYPE]) into #T from CET

while (exists(select 1 from #T ,(select DESC0,DESC1 from #T) as X where charindex(X.DESC0,#T.DESC02)>0))
begin
update #T
set DESC02 = replace(#T.DESC02,X.DESC0,X.DESC1)
from #T,(select DESC0,DESC1 from #T) as X
where charindex(X.DESC0,#T.DESC02)>0
END
结果出现问题了,

playwarcraft 2015-09-16
  • 打赏
  • 举报
回复

--方法是有的,利用xml来实现,程式看起来比较繁琐,不易读
--你可以用以下的例子修改下,原理一样

create table tba(ID int,classid varchar(20))
insert into tba values(1,'1,2,3')
insert into tba values(2,'2,3'  )
insert into tba values(3,'1,3'  )
create table tbb(ID varchar(10), classname nvarchar(10))
insert into tbb values('1',N'衣服')
insert into tbb values('2',N'上衣')
insert into tbb values('3',N'裤子')
go


SELECT id , classname  FROM
(
  SELECT DISTINCT id FROM (select tbc.id  , tbb.classname from 
  (
    SELECT A.id ,  B.classid FROM(SELECT id, [classid] = CONVERT(xml,'<root><v>' + REPLACE([classid], ',', '</v><v>') + '</v></root>') FROM tba)A
    OUTER APPLY(SELECT classid = N.v.value('.', 'nvarchar(100)') FROM A.[classid].nodes('/root/v') N(v))B
  ) tbc , tbb where tbc.classid = tbb.id
  ) T
)A 
OUTER APPLY
(
  SELECT [classname]= STUFF(REPLACE(REPLACE((
    SELECT classname FROM (select tbc.id , tbb.classname from 
    (
      SELECT A.id  , B.classid FROM(SELECT id , [classid] = CONVERT(xml,'<root><v>' + REPLACE([classid], ',', '</v><v>') + '</v></root>') FROM tba)A
      OUTER APPLY(SELECT classid = N.v.value('.', 'nvarchar(100)') FROM A.[classid].nodes('/root/v') N(v))B
    ) tbc , tbb where tbc.classid = tbb.id
  ) N
  WHERE id = A.id 
  FOR XML AUTO), '<N classname="', ','), '"/>', ''), 1, 1, '')
)N
order by id

drop table tba,tbb

/*
id          classname      
----------- -------------- 
1	衣服,上衣,裤子
2	上衣,裤子
3	衣服,裤子

*/


Pact_Alice 2015-09-16
  • 打赏
  • 举报
回复
引用 3 楼 zbdzjx 的回复:
1、感觉这个表内容有问题。 2、如果TYPE中的几个内容是用空格分开的,可以拆分、替换、组合。如果不是按空格分开,除了临时表应该没办法了。
真的就没有别的方法了吗?
zbdzjx 2015-09-16
  • 打赏
  • 举报
回复
1、感觉这个表内容有问题。 2、如果TYPE中的几个内容是用空格分开的,可以拆分、替换、组合。如果不是按空格分开,除了临时表应该没办法了。
Pact_Alice 2015-09-16
  • 打赏
  • 举报
回复
引用 1 楼 playwarcraft 的回复:

--这样设计感觉欠妥,试试临时表更新吧

WITH CET AS (
select 'C0001'PromotionCode,   NULL TYPE, NULL DESC0,    'FALSE' DESC01 UNION all
select 'C0001', N'买数量送百分比数量',  N'买数量送百分比数量', 'False' UNION all
select 'C0001', N'合同金额 True 销售数量',N'销售数量', 'True'  UNION all
select 'C0001', N'合同金额 True 销售数量',N'合同金额', 'False'
)

select *, DESC02 = convert(nvarchar(50),[TYPE]) into #T from CET

while (exists(select 1 from #T ,(select DESC0,DESC01 from #T) as X where charindex(X.DESC0,#T.DESC02)>0))
begin
  update #T
  set DESC02 = replace(#T.DESC02,X.DESC0,X.DESC01)
  from #T,(select DESC0,DESC01 from #T) as X 
  where charindex(X.DESC0,#T.DESC02)>0
end

select * from #T
/*
C0001	NULL	NULL	FALSE	NULL
C0001	买数量送百分比数量	买数量送百分比数量	False	False
C0001	合同金额 True 销售数量	销售数量	True	False True True
C0001	合同金额 True 销售数量	合同金额	False	False True True
*/
drop table #T

我也感觉不妥,可是现在需要达到这样的效果,我需要一次性查出结果,不能使用临时表转换,因为CTE表中的数据已经是我多次cte得到的了
playwarcraft 2015-09-16
  • 打赏
  • 举报
回复

--这样设计感觉欠妥,试试临时表更新吧

WITH CET AS (
select 'C0001'PromotionCode,   NULL TYPE, NULL DESC0,    'FALSE' DESC01 UNION all
select 'C0001', N'买数量送百分比数量',  N'买数量送百分比数量', 'False' UNION all
select 'C0001', N'合同金额 True 销售数量',N'销售数量', 'True'  UNION all
select 'C0001', N'合同金额 True 销售数量',N'合同金额', 'False'
)

select *, DESC02 = convert(nvarchar(50),[TYPE]) into #T from CET

while (exists(select 1 from #T ,(select DESC0,DESC01 from #T) as X where charindex(X.DESC0,#T.DESC02)>0))
begin
  update #T
  set DESC02 = replace(#T.DESC02,X.DESC0,X.DESC01)
  from #T,(select DESC0,DESC01 from #T) as X 
  where charindex(X.DESC0,#T.DESC02)>0
end

select * from #T
/*
C0001	NULL	NULL	FALSE	NULL
C0001	买数量送百分比数量	买数量送百分比数量	False	False
C0001	合同金额 True 销售数量	销售数量	True	False True True
C0001	合同金额 True 销售数量	合同金额	False	False True True
*/
drop table #T

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧