UPDATE table SET name=IIF(substring(name,1,1)<>1,'','story_typeA|story_type"+STR(patindex('%1%',substring(name,2,LEN(name)-1)),1,0)+'a')

解决方案 »

  1.   

    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
      

  2.   

    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 {...}用即可
      

  3.   

    Update TableName Set Name=(Case When CharIndex('1',Name)>0 Then 'story_typeA|story_type'+Rtrim(CharIndex('1',Name,2)-1)+'a' Else '' End)
      

  4.   

    --建立测试环境
    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*/
      

  5.   

    --创建测试环境
    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
    */
      

  6.   

    woxiangfang(小黑黑脸)写的,SQL没有IIF函数红尘和DreamStrat(梦启动的摇篮…) ,写的过于麻烦了,可以直接利用CharIndex函数的。
      

  7.   

    To paoluo(一天到晚游泳的鱼) :
    要是name中的1的个数大于2,你的就错了
      

  8.   

    TO vivianfdlpw() :不会出错的。1.就楼主的数据看,没有看到1多余两个的情况。2.如果1多于2个,那么就楼主写的函数,也会找到第二个1的位置,来决定字符串的形式。
      我写的那段代码,CharIndex会找到第二个1的位置,来决定字符串的形式,所以结果和楼主要的是一样的,更多的1并不会造成影响的。不过我少写了一种情况,倒是真的,补上。
      

  9.   

    哦,楼主好像自己也考虑少了,不知道1000000这种情况会不会出现,楼主没有写出对应的Update的原则。
      

  10.   

    to:paoluo(一天到晚游泳的鱼) 
    有可能出现出现这种特殊情况
    1000000
    story_typeA|
      

  11.   

    对了,如果我要用句SQL直接更新数据库表tb1里的数据,该怎么实现呢?
    以前都是用orcl,现在弄sql 头都大了。
    update tb1 set name =(...)
      

  12.   

    决定了没??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
      

  13.   

    是啊,是原来有的数据库里面有可能出现,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)
    如果在数据库中直接执行该语句将截断字符串或二进制数据。
    语句已终止。
      

  14.   

    将截断字符串或二进制数据。
    语句已终止
    这个错误的原因了,我知道了,不用麻烦paoluo(一天到晚游泳的鱼) 你了
    NND,sql 用起来还真是不顺手
      

  15.   

    原因是你的Name定义的长度不够,改长点就可以了。