drop table #tcreate table #t(name varchar(50)) insert into #t select '1010000' insert into #t select '1100000' insert into #t select '1000001' insert into #t select '1001000' insert into #t select '0000000' update #t set name = isnull(stuff( case when substring(name,1,1)='1' then '|story_typeA' else '' end + case when substring(name,2,1)='1' then '|story_type1a' else '' end + case when substring(name,3,1)='1' then '|story_type2a' else '' end + case when substring(name,4,1)='1' then '|story_type3a' else '' end + case when substring(name,5,1)='1' then '|story_type4a' else '' end + case when substring(name,6,1)='1' then '|story_type5a' else '' end + case when substring(name,7,1)='1' then '|story_type6a' else '' end ,1,1,''),'""') select * from #t
Update TableName set ColumnName = case when substring(ColumnName,1,1) = '1' then 'story_typeA' else '' end + case when substring(ColumnName,2,1) = '1' then +'|'+story_type1a else case when substring(ColumnName,3,1) = '1' then '|'+story_type2a else case when ...else .. end end end将case when ... else... end 当作 if {...} else {...}用即可
Update TableName Set Name=(Case When CharIndex('1',Name)>0 Then 'story_typeA|story_type'+Rtrim(CharIndex('1',Name,2)-1)+'a' Else '' End)
--建立测试环境 Create Table TEST(Name Varchar(50)) Insert TEST Values('1010000') Insert TEST Values('1100000') Insert TEST Values('1000001') Insert TEST Values('1001000') Insert TEST Values('0000000') --测试 Update TEST Set Name=(Case When CharIndex('1',Name)>0 Then 'story_typeA|story_type'+Rtrim(CharIndex('1',Name,2)-1)+'a' Else '' End)Select * from TEST --删除测试环境 Drop Table TEST --结果 /* Name story_typeA|story_type2a story_typeA|story_type1a story_typeA|story_type6a story_typeA|story_type3a*/
--创建测试环境 create table tb ( name varchar(2000) ) insert tb select '1010000' union select '1100000' union select '1000001' union select '1001000' union select '0000000'if exists(select 1 from sysobjects where id=object_id('[dbo].[getstr]') and xtype='fn') drop function [dbo].[getstr] go create function [dbo].[getstr] ( @name varchar(2000) ) returns varchar(2000) as begin declare @str varchar(2000) declare @tmp int select @str='',@tmp=0 while len(@name)>=1 begin if substring(@name,1,1)=1 begin set @str=@str+'|'+'story_type'+(case when @tmp=0 then '' else cast(@tmp as varchar) end)+'a' end set @name=ltrim(stuff(@name,1,1,'')) set @tmp=@tmp+1 end return stuff(@str,1,1,'') endgo --测试 select name,[dbo].[getstr](name) [name] from tb update tb set name=[dbo].[getstr](name) select * from tb--删除测试环境 drop table tb--结果 /*name name --------------------------------------- 0000000 NULL 1000001 story_typea|story_type6a 1001000 story_typea|story_type3a 1010000 story_typea|story_type2a 1100000 story_typea|story_type1aname ------------------------- NULL story_typea|story_type6a story_typea|story_type3a story_typea|story_type2a story_typea|story_type1a */
TO vivianfdlpw() :不会出错的。1.就楼主的数据看,没有看到1多余两个的情况。2.如果1多于2个,那么就楼主写的函数,也会找到第二个1的位置,来决定字符串的形式。 我写的那段代码,CharIndex会找到第二个1的位置,来决定字符串的形式,所以结果和楼主要的是一样的,更多的1并不会造成影响的。不过我少写了一种情况,倒是真的,补上。
对了,如果我要用句SQL直接更新数据库表tb1里的数据,该怎么实现呢? 以前都是用orcl,现在弄sql 头都大了。 update tb1 set name =(...)
决定了没??1000000更新为story_typeA|这么吗??另外,我写的就是Update 的语句啊。Update tb1 Set Name=(Case When CharIndex('1',Name)>0 Then 'story_typeA|story_type'+Rtrim(CharIndex('1',Name,2)-1)+'a' Else '' End)Select * from tb1
是啊,是原来有的数据库里面有可能出现,1000000而现在却要更新为story_typeA| 另外, Update tb1 Set Name=(Case When CharIndex('1',Name)>0 Then 'story_typeA|story_type'+Rtrim(CharIndex('1',Name,2)-1)+'a' Else '' End) 如果在数据库中直接执行该语句将截断字符串或二进制数据。 语句已终止。
insert into #t select '1010000'
insert into #t select '1100000'
insert into #t select '1000001'
insert into #t select '1001000'
insert into #t select '0000000'
update
#t
set
name =
isnull(stuff(
case when substring(name,1,1)='1' then '|story_typeA' else '' end
+
case when substring(name,2,1)='1' then '|story_type1a' else '' end
+
case when substring(name,3,1)='1' then '|story_type2a' else '' end
+
case when substring(name,4,1)='1' then '|story_type3a' else '' end
+
case when substring(name,5,1)='1' then '|story_type4a' else '' end
+
case when substring(name,6,1)='1' then '|story_type5a' else '' end
+
case when substring(name,7,1)='1' then '|story_type6a' else '' end
,1,1,''),'""')
select * from #t
Create Table TEST(Name Varchar(50))
Insert TEST Values('1010000')
Insert TEST Values('1100000')
Insert TEST Values('1000001')
Insert TEST Values('1001000')
Insert TEST Values('0000000')
--测试
Update TEST Set Name=(Case When CharIndex('1',Name)>0 Then 'story_typeA|story_type'+Rtrim(CharIndex('1',Name,2)-1)+'a' Else '' End)Select * from TEST
--删除测试环境
Drop Table TEST
--结果
/*
Name
story_typeA|story_type2a
story_typeA|story_type1a
story_typeA|story_type6a
story_typeA|story_type3a*/
create table tb
(
name varchar(2000)
)
insert tb
select '1010000' union select '1100000' union
select '1000001' union select '1001000' union
select '0000000'if exists(select 1 from sysobjects where id=object_id('[dbo].[getstr]') and xtype='fn')
drop function [dbo].[getstr]
go
create function [dbo].[getstr]
(
@name varchar(2000)
)
returns varchar(2000)
as
begin
declare @str varchar(2000)
declare @tmp int
select @str='',@tmp=0
while len(@name)>=1
begin
if substring(@name,1,1)=1
begin
set @str=@str+'|'+'story_type'+(case when @tmp=0 then '' else cast(@tmp as varchar) end)+'a'
end
set @name=ltrim(stuff(@name,1,1,''))
set @tmp=@tmp+1
end
return stuff(@str,1,1,'')
endgo --测试
select name,[dbo].[getstr](name) [name] from tb
update tb set name=[dbo].[getstr](name)
select * from tb--删除测试环境
drop table tb--结果
/*name name
---------------------------------------
0000000 NULL
1000001 story_typea|story_type6a
1001000 story_typea|story_type3a
1010000 story_typea|story_type2a
1100000 story_typea|story_type1aname
-------------------------
NULL
story_typea|story_type6a
story_typea|story_type3a
story_typea|story_type2a
story_typea|story_type1a
*/
要是name中的1的个数大于2,你的就错了
我写的那段代码,CharIndex会找到第二个1的位置,来决定字符串的形式,所以结果和楼主要的是一样的,更多的1并不会造成影响的。不过我少写了一种情况,倒是真的,补上。
有可能出现出现这种特殊情况
1000000
story_typeA|
以前都是用orcl,现在弄sql 头都大了。
update tb1 set name =(...)
另外,
Update tb1 Set Name=(Case When CharIndex('1',Name)>0 Then 'story_typeA|story_type'+Rtrim(CharIndex('1',Name,2)-1)+'a' Else '' End)
如果在数据库中直接执行该语句将截断字符串或二进制数据。
语句已终止。
语句已终止
这个错误的原因了,我知道了,不用麻烦paoluo(一天到晚游泳的鱼) 你了
NND,sql 用起来还真是不顺手