数据库数据如下:
id   value
1    湖北.武汉.中国
2    湖南.长沙.中国
3    河南.郑州.中国
4    德克萨斯州.休斯顿.美国
5    德克萨斯州.达拉斯.美国如何显示为如下:
id   value
1    中国.湖北.武汉
2    中国.湖南.长沙
3    中国.河南.郑州
4    美国.休斯顿.德克萨斯州
5    美国.达拉斯.德克萨斯州把国家放在最前面!

解决方案 »

  1.   

    if OBJECT_ID('tempdb.dbo.#temp') is not null drop table #temp
    create table #temp
    (
    id int,
    [value] nvarchar(100)
    )
    insert #temp
    select 1, N'湖北.武汉.中国' union all
    select 2, N'湖南.长沙.中国' union all
    select 3, N'河南.郑州.中国' union all
    select 4, N'德克萨斯州.休斯顿.美国' union all
    select 5, N'德克萨斯州.达拉斯.美国'
    go
    select * from #tempselect id,
    [value] = PARSENAME([value], 1) + N'.' + PARSENAME([value], 2) + N'.' + PARSENAME([value], 3)
    from #temp
    /*
    id value
    1 中国.武汉.湖北
    2 中国.长沙.湖南
    3 中国.郑州.河南
    4 美国.休斯顿.德克萨斯州
    5 美国.达拉斯.德克萨斯州
    */
      

  2.   

    select id,parsename([value],1)+'.'+parsename([value],3)+'.'parsename([value],2)
    from tb
      

  3.   

    select id,
    [value] = PARSENAME([value], 1) + N'.' + PARSENAME([value], 3) + N'.' + PARSENAME([value], 2)
    from #temp
    /*
    id value
    1 中国.湖北.武汉
    2 中国.湖南.长沙
    3 中国.河南.郑州
    4 美国.德克萨斯州.休斯顿
    5 美国.德克萨斯州.达拉斯
    */
      

  4.   

    PARSENAME
    返回对象名的指定部分。可以检索的对象部分有对象名、所有者名称、数据库名称和服务器名称。
    说明  PARSENAME 函数不表明所指定名称的对象是否存在,而只是返回给定对象名的指定部分。
    语法
    PARSENAME ( 'object_name' , object_piece ) 参数
    'object_name'要检索其指定部分的对象名。object_name 是 sysname 值。本参数是可选的合法对象名。如果该对象名的所有部分均符合要求,则该名称由以下四部分组成:服务器名称、数据库名称、所有者名称和对象名。object_piece要返回的对象部分。object_piece 是 int 值,可以为下列值。Value 描述 
    1 对象名 
    2 所有者名称 
    3 数据库名称 
    4 服务器名称 
    返回类型
    nchar注释
    如果符合下列条件之一,则 PARSENAME 返回 NULL 值: object_name 或 object_piece 为 NULL 值。
    发生语法错误。
    所请求的对象部分长度为 0,并且是无效的 Microsoft® SQL Server™ 标识符。零长度的对象名将导致整个合法名称无效。 
    示例
    本示例使用 PARSENAME 返回有关 pubs 数据库中 authors 表的信息。
    USE pubs
    SELECT PARSENAME('pubs..authors', 1) AS 'Object Name'
    SELECT PARSENAME('pubs..authors', 2) AS 'Owner Name'
    SELECT PARSENAME('pubs..authors', 3) AS 'Database Name'
    SELECT PARSENAME('pubs..authors', 4) AS 'Server Name'下面是结果集:Object Name                    
    ------------------------------ 
    authors                        (1 row(s) affected)Owner Name                     
    ------------------------------ 
    (null)                         (1 row(s) affected)Database Name                  
    ------------------------------ 
    pubs                           (1 row(s) affected)Server Name                    
    ------------------------------ 
    (null)                         (1 row(s) affected)
      

  5.   

    要去找找PARSENAME()的用法先。
      

  6.   


    create table t1
    (
    id int,
    vol varchar(50)
    )
    insert into t1
    select 1, '湖北.武汉.中国' union all
    select 2, '湖南.长沙.中国' union all
    select 3, '河南.郑州.中国' union all
    select 4, '德克萨斯州.休斯顿.美国' union all
    select 5, '德克萨斯州.达拉斯.美国';with abc as
    (select id,vol,charindex('.',reverse(vol)) as vol1 from t1)
    select id,vol,right(vol,vol1-1)+'.'+left(vol,len(vol)-vol1) as vol2 from abc
      

  7.   


    --分割符多字节 
    CREATE FUNCTION [dbo].[split](@Long_str varchar(8000),@split_str varchar(100))    
    RETURNS  @tmp TABLE(        
        ID int IDENTITY PRIMARY KEY,      
        short_str varchar(8000)    
    )    
    AS   
    BEGIN   
        DECLARE @long_str_Tmp varchar(8000),
       @short_str varchar(8000),
       @split_str_length int   
     
        SET @split_str_length = LEN(@split_str)    
     
        IF CHARINDEX(@split_str,@Long_str)=1 
             SET @long_str_Tmp=SUBSTRING(@Long_str,
         @split_str_length+1,
         LEN(@Long_str)-@split_str_length)
     
        ELSE
             SET @long_str_Tmp=@Long_str
     
        IF CHARINDEX(REVERSE(@split_str),REVERSE(@long_str_Tmp))>1    
            SET @long_str_Tmp=@long_str_Tmp+@split_str    
        ELSE   
            SET @long_str_Tmp=@long_str_Tmp    
     
        WHILE CHARINDEX(@split_str,@long_str_Tmp)>0    
            BEGIN   
                SET @short_str=SUBSTRING(@long_str_Tmp,1,
         CHARINDEX(@split_str,@long_str_Tmp)-1)    
                DECLARE @long_str_Tmp_LEN INT,@split_str_Position_END int   
                SET @long_str_Tmp_LEN = LEN(@long_str_Tmp)    
                SET @split_str_Position_END = LEN(@short_str)+@split_str_length    
                SET @long_str_Tmp=REVERSE(SUBSTRING(REVERSE(@long_str_Tmp),1,
         @long_str_Tmp_LEN-@split_str_Position_END))
                IF @short_str<>'' INSERT INTO @tmp SELECT @short_str    
            END   
        RETURN     
    END
    if object_id('tb') is not null drop table tb
    GO
    create table tb(id int,val varchar(100))
    insert into tb
    select 1,'湖北.武汉.汉口.镇.中国' union all
    select 2,'湖南.长沙.中国' union all
    select 3,'河南.郑州.中国' union all
    select 4,'德克萨斯州.休斯顿.美国' union all
    select 5,'德克萨斯州.达拉斯.美国'select t.id,val=stuff((select '.' + short_str from split(t.val,'.') order by id desc  for xml path('')),1,1,'')  from tb t
    --结果
    id          val
    ----------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    1           中国.镇.汉口.武汉.湖北
    2           中国.长沙.湖南
    3           中国.郑州.河南
    4           美国.休斯顿.德克萨斯州
    5           美国.达拉斯.德克萨斯州(5 行受影响)
      

  8.   

    从省-市-国
    转为
    国-省-市
    湖北.武汉.中国
    中国.湖北.武汉ORACLE SQL:
    SELECT substr('湖北.武漢.中國',INSTR('湖北.武漢.中國','.',-1) +1)||'.'
     || substr('湖北.武漢.中國',1,INSTR('湖北.武漢.中國','.',-1)-1 ) as LOCATE from dual;