create table tb(clime varchar(20) , unit varchar(20))
insert into tb values('海南省', '电信(全省共用)')
insert into tb values('辽宁' , '网通')
goselect clime = clime + substring(unit , charindex('(',unit) + 1 , charindex(')',unit) - charindex('(',unit) - 1) ,
unit = left(unit , charindex('(',unit) - 1)
from tb where charindex('(',unit) > 0 and charindex(')',unit) > 0 and charindex('(',unit) < charindex(')',unit)
union all
select * from tb where charindex('(',unit) = 0drop table tb/*
clime unit
---------------------------------------- --------------------
海南省全省共用 电信
辽宁 网通(所影响的行数为 2 行)
*/
insert into tb values('海南省', '电信(全省共用)')
insert into tb values('辽宁' , '网通')
goselect clime = clime + substring(unit , charindex('(',unit) + 1 , charindex(')',unit) - charindex('(',unit) - 1) ,
unit = left(unit , charindex('(',unit) - 1)
from tb where charindex('(',unit) > 0 and charindex(')',unit) > 0 and charindex('(',unit) < charindex(')',unit)
union all
select * from tb where charindex('(',unit) = 0drop table tb/*
clime unit
---------------------------------------- --------------------
海南省全省共用 电信
辽宁 网通(所影响的行数为 2 行)
*/
INSERT @T SELECT N'海南省', N'电信(全省共用)'
INSERT @T SELECT N'辽宁' ,N'网通'
SELECT clime= CASE WHEN CHARINDEX('(',UNIT)>0 THEN CLIME+SUBSTRING(UNIT,CHARINDEX('(',UNIT)+1,CHARINDEX(')',UNIT)-CHARINDEX('(',UNIT)-1)
ELSE clime END,
unit=CASE WHEN CHARINDEX('(',UNIT)>0 THEN LEFT(UNIT,CHARINDEX('(',UNIT)-1) ELSE unit END FROM @T
/*clime unit
---------------------------------------- --------------------
海南省全省共用 电信
辽宁 网通
*/
dawugui兄和wufeng4552兄,真是经验丰富!多谢!
go
create table [tb1]([clime] varchar(20),[unit] varchar(14))
insert [tb1]
select '海南省','电信(全省共用)' union all
select '辽宁','网通'select * from [tb1]select clime=clime+substring(unit,charindex('(',unit)+1,len(unit)-charindex('(',unit)-1)
,unit=case charindex('(',unit) when 0 then unit else left(unit,charindex('(',unit)-1) end
from tb1--测试结果:
/*
clime unit
-------------------- --------------
海南省全省共用 电信
辽宁网 网通(2 行受影响)*/
create table tb(clime varchar(20) , unit varchar(40))
insert into tb values('海南省', '电信(全省共用)')
insert into tb values('辽宁' , '网通')
insert into tb values('海南省', '电信(全省(代码1234)共用)')
go则只有 szx1999 方法正确.
go
create table tb2(clime varchar(20) , unit varchar(40))
insert into tb2 values('海南省', '电信(全省共用)')
insert into tb2 values('辽宁' , '网通')
insert into tb2 values('海南省', '电信(全省(代码1234)共用)')
insert into tb2 (clime) values('辽宁')
select * from [tb2]wufeng4552兄的出来会少右括号,结果如下:
clime unit
海南省全省共用 电信
辽宁 网通
海南省全省(代码1234 电信
辽宁 NULLszx1999兄的出来没少括号,但是空值会把数据覆盖,结果如下:
clime unit
海南省全省共用 电信
辽宁 网通
海南省全省(代码1234) 电信
1、
select * from [tb2]
SELECT clime= CASE WHEN CHARINDEX('(',UNIT)>0 THEN CLIME+SUBSTRING(UNIT,CHARINDEX('(',UNIT)+1,len(unit)-charindex('(',unit)-1)
ELSE clime END,
unit=CASE WHEN CHARINDEX('(',UNIT)>0 THEN LEFT(UNIT,CHARINDEX('(',UNIT)-1) ELSE unit END FROM tb2
2、
select * from [tb2]
update tb2 set clime=clime+substring(unit,charindex('(',unit)+1,len(unit)-charindex('(',unit)-1)
,unit=case charindex('(',unit) when 0 then unit else left(unit,charindex('(',unit)-1) end
where unit is not null
select * from [tb2]但是现在表中的数据样式五花八门,如下:
if object_id('[tb2]') is not null drop table [tb2]
go
create table tb2(clime varchar(40) , unit varchar(40))
insert into tb2 values('海南省', '电信(全省共用)')
insert into tb2 values('辽宁' , '网通')
insert into tb2 values('海南省', '电信(全省(代码1234)共用)abc')
insert into tb2 (clime) values('辽宁')
insert into tb2 values('辽宁' , '(网通)')SELECT clime= CASE WHEN CHARINDEX('(',UNIT)>0 THEN CLIME+SUBSTRING(UNIT,CHARINDEX('(',UNIT)+1,RIGHT(UNIT,CHARINDEX(')',UNIT)+1))
ELSE clime END,
unit=CASE WHEN CHARINDEX('(',UNIT)>0 THEN LEFT(UNIT,CHARINDEX('(',UNIT)-1) ELSE unit END FROM tb2
报错,提示:
参数数据类型 varchar 对于 substring 函数的参数 3 无效。不知道什么原因。