如何替换B字段内包含A字段文字的部分

flyfranker 2010-03-12 04:47:04
TEST表
A字段 varchar(50) 内容(客户姓名)
B字段 varchar(1000) 内容(其他字符...客户姓名...其他字符)
需要达到效果
B字段内容替换成(其他字符......其他字符)
如何将每个数据行内的B字段内所有符合A字段内容的文字部分替换成空隔或其他字符?
...全文
341 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
lanjiazhu 2011-07-10
  • 打赏
  • 举报
回复
我也遇到这个问题了,怎么刚才没找到~~诶……
幸运的意外 2010-03-15
  • 打赏
  • 举报
回复
update tb
set b=replace(b,a,'')
直接替换就可以了吧.
flyfranker 2010-03-15
  • 打赏
  • 举报
回复
还没搞定,哎
ws_hgo 2010-03-15
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 flyfranker 的回复:]
update test set b=replace(b,a,'')

命令有效,结帖。
[/Quote]


和我5楼的一样
flyfranker 2010-03-15
  • 打赏
  • 举报
回复
update test set b=replace(b,a,'')

命令有效,结帖。
永生天地 2010-03-15
  • 打赏
  • 举报
回复
update test
set B字段=REPLACE(B字段,A字段,'')
feixianxxx 2010-03-14
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 flyfranker 的回复:]
引用 21 楼 feixianxxx 的回复:
给你的测试数据和结果。。看得都晕了。。。。


实际上就是在同一张表内,把B字段内所有包含A字段内容的文字替换删除,这很难理解吗?
[/Quote]
replace 不能么?
flyfranker 2010-03-14
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 feixianxxx 的回复:]
给你的测试数据和结果。。看得都晕了。。。。
[/Quote]

实际上就是在同一张表内,把B字段内所有包含A字段内容的文字替换删除,这很难理解吗?
feixianxxx 2010-03-14
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 flyfranker 的回复:]
想不到这个问题这么难解决
[/Quote]

给你的测试数据和结果。。看得都晕了。。。。
flyfranker 2010-03-14
  • 打赏
  • 举报
回复
想不到这个问题这么难解决
SQL77 2010-03-13
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 ldslove 的回复:]
引用 16 楼 sql77 的回复:
SQL code
DECLARE @B TABLE([log] VARCHAR(8000))
INSERT @B SELECT
'由 张三 于 2008-9-22 将 [客户名称] 由 CSDN有限公司 改为 CSDN有限公司; 由 李四 于 2009-10-12 将 [客户名称] 由 CSDN有限公司 改为 CSDN有限公司;'
DECLARE @……
[/Quote]
那肯定要有姓名表才行啊,要不然怎么判断是姓名
flyfranker 2010-03-13
  • 打赏
  • 举报
回复
难道真的没人知道怎么解决吗?
东那个升 2010-03-12
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 sql77 的回复:]
SQL code
DECLARE @B TABLE([log] VARCHAR(8000))
INSERT @B SELECT
'由 张三 于 2008-9-22 将 [客户名称] 由 CSDN有限公司 改为 CSDN有限公司; 由 李四 于 2009-10-12 将 [客户名称] 由 CSDN有限公司 改为 CSDN有限公司;'
DECLARE @A TABLE([A] VARCHAR……
[/Quote]

他是要把姓名替换掉
SQL77 2010-03-12
  • 打赏
  • 举报
回复
DECLARE @B TABLE([log] VARCHAR(8000))
INSERT @B SELECT
'由 张三 于 2008-9-22 将 [客户名称] 由 CSDN有限公司 改为 CSDN有限公司; 由 李四 于 2009-10-12 将 [客户名称] 由 CSDN有限公司 改为 CSDN有限公司;'
DECLARE @A TABLE([A] VARCHAR(8000))
INSERT @A SELECT
'CSDN有限公司'

UPDATE @B SET [LOG]=REPLACE([LOG],A,'') FROM @A WHERE CHARINDEX(A,[LOG])>0

SELECT * FROM @B


(所影响的行数为 1 行)


(所影响的行数为 1 行)


(所影响的行数为 1 行)

log
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
由 张三 于 2008-9-22 将 [客户名称] 由 改为 ; 由 李四 于 2009-10-12 将 [客户名称] 由 改为 ;

(所影响的行数为 1 行)
???????????????
flyfranker 2010-03-12
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 ldslove 的回复:]
你是要把LOG字段中的2个姓名都替换掉。。。。
[/Quote]

准确的说是无论出现多少次,只要包含A字段内容的就全部替换为空隔或其他字符。
东那个升 2010-03-12
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 flyfranker 的回复:]
引用 10 楼 sql_sf 的回复:
拿数据吧


log字段内容:
由 张三 于 2008-9-22 将 [客户名称] 由 CSDN有限公司 改为 CSDN有限公司; 由 李四 于 2009-10-12 将 [客户名称] 由 CSDN有限公司 改为 CSDN有限公司;
na字段内容:
CSDN有限公司

需要效果:
log字段内容:
由 张三 于 2008-9-22 将 ……
[/Quote]
你是要把LOG字段中的2个姓名都替换掉。。。。
eastvin 2010-03-12
  • 打赏
  • 举报
回复

自己的作业自己做,表偷懒了。 嘿嘿嘿嘿。
flyfranker 2010-03-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 sql_sf 的回复:]
拿数据吧
[/Quote]

log字段内容:
由 张三 于 2008-9-22 将 [客户名称] 由 CSDN有限公司 改为 CSDN有限公司; 由 李四 于 2009-10-12 将 [客户名称] 由 CSDN有限公司 改为 CSDN有限公司;
na字段内容:
CSDN有限公司

需要效果:
log字段内容:
由 张三 于 2008-9-22 将 [客户名称] 由 改为 ; 由 李四 于 2009-10-12 将 [客户名称] 由 改为 ;

将 [客户名称] 由 改为 这些固定的文字内容我自己会清理,求教的是变化的内容如何清理。
dawugui 2010-03-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 flyfranker 的回复:]
同志们,你们想的太简单了,A字段内的客户姓名全是不固定的啊,需要使用游标才能解决问题的。
[/Quote]

[Quote=引用 9 楼 flyfranker 的回复:]
同志们,你们想的太简单了,A字段内的客户姓名全是不固定的啊,需要使用游标才能解决问题的。
[/Quote]

你是说每个B可能包含多个A?以逗号或其他符号分割?
那参考如下的内容,做成子查询来完成.

/*
标题:数据拆分1
作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
时间:2008-11-20
地点:广东深圳
描述

有表tb, 如下:
id value
----------- -----------
1 aa,bb
2 aaa,bbb,ccc
欲按id,分拆value列, 分拆后结果如下:
id value
----------- --------
1 aa
1 bb
2 aaa
2 bbb
2 ccc
*/

--1. 旧的解决方法(sql server 2000)
SELECT TOP 8000 id = IDENTITY(int, 1, 1) INTO # FROM syscolumns a, syscolumns b

SELECT A.id, value = SUBSTRING(A.[value], B.id, CHARINDEX(',', A.[value] + ',', B.id) - B.id)
FROM tb A, # B
WHERE SUBSTRING(',' + A.[value], B.id, 1) = ','

DROP TABLE #

--2. 新的解决方法(sql server 2005)
create table tb(id int,value varchar(30))
insert into tb values(1,'aa,bb')
insert into tb values(2,'aaa,bbb,ccc')
go
SELECT A.id, B.value
FROM(
SELECT id, [value] = CONVERT(xml,'<root><v>' + REPLACE([value], ',', '</v><v>') + '</v></root>') FROM tb
)A
OUTER APPLY(
SELECT value = N.v.value('.', 'varchar(100)') FROM A.[value].nodes('/root/v') N(v)
)B

DROP TABLE tb

/*
id value
----------- ------------------------------
1 aa
1 bb
2 aaa
2 bbb
2 ccc

(5 行受影响)
*/



SQL2005用Xml:

select
a.COl1,b.Col2
from
(select Col1,COl2=convert(xml,'<root><v>'+replace(COl2,',','</v><v>')+'</v></root>') from Tab)a
outer apply
(select Col2=C.v.value('.','nvarchar(100)') from a.COl2.nodes('/root/v')C(v))b




SQL05用CTE:

;with roy as
(select Col1,COl2=cast(left(Col2,charindex(',',Col2+',')-1) as nvarchar(100)),Split=cast(stuff(COl2+',',1,charindex(',',Col2+','),'') as nvarchar(100)) from Tab
union all
select Col1,COl2=cast(left(Split,charindex(',',Split)-1) as nvarchar(100)),Split= cast(stuff(Split,1,charindex(',',Split),'') as nvarchar(100)) from Roy where split>''
)
select COl1,COl2 from roy order by COl1 option (MAXRECURSION 0)

生成结果:
/*
Col1 COl2
----------- -----
1 a
1 b
1 c
2 d
2 e
3 f
*/
sql_sf 2010-03-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 flyfranker 的回复:]
同志们,你们想的太简单了,A字段内的客户姓名全是不固定的啊,需要使用游标才能解决问题的。
[/Quote]
拿数据吧
加载更多回复(9)

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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