请问在sql2005数据库中,可写一下函数:if  object_id('orderchar')<>0  drop function orderchar
go
create function OrderChar(@OriStr varchar(100)) 
returns varchar(100) 
as 
BEGIN 
   DECLARE @re varchar(100) --返回值 
   DECLARE @ch char --一次扫描所存放最小的字符 
DECLARE @charnum int --源字符串长度 
DECLARE @i int,@j int,@k int --游标 
set @charnum=LEN(@Oristr) 
set @i=1 
set @j=0 
while len(@oristr)>0  --外层循环 
BEGIN 

SET @ch=SUBSTRING(@OriStr,1,1) 
        set @j=1
while @j<=len(@oristr) --内层循环 
BEGIN 
if ASCII(SUBSTRING(@OriStr,@j,1)) < ASCII(@ch) --如果OriStr[j]值比ch小,则把OriStr[j]赋值给ch 
            begin
SET @ch=SUBSTRING(@OriStr,@j,1)   
            set @k=@j          
            end
SET @j=@j+1 
END 
set @re=isnull(@re ,'')+ @ch --把ch追加给re 
    set @oristr=stuff(@oristr,@k,1,'')

END 
return @re 
END 
GO SELECT dbo.OrderChar('wangmeng') aeggmnnw实现字段内容按字母顺序排序,请问在oracle中怎么写呢?

解决方案 »

  1.   

    Oracle9i之前,中文是按照二进制编码进行排序的。 
    在oracle9i中新增了按照拼音、部首、笔画排序功能。设置NLS_SORT值 
    SCHINESE_RADICAL_M 按照部首(第一顺序)、笔划(第二顺序)排序 
    SCHINESE_STROKE_M 按照笔划(第一顺序)、部首(第二顺序)排序 
    SCHINESE_PINYIN_M 按照拼音排序 
    修改ORACLE字段的默认排序方式:
    按拼音(默认):  alter session set nls_sort = SCHINESE_PINYIN_M;
    按笔画:alter session set nls_sort = SCHINESE_STROKE_M;
    按偏旁:alter session set nls_sort = NLS_SORT=SCHINESE_RADICAL_M;
    SQL> drop table cc;
    表已丢弃。
    SQL>  create table cc (b varchar2(20))
    表已创建。
    SQL>  insert into cc values('一');
    已创建 1 行。
    SQL> insert into cc values('二');
    已创建 1 行。
    SQL> insert into cc values('三');
    已创建 1 行。
    SQL> insert into cc values('四');
    已创建 1 行。
    SQL> insert into cc values('五');
    已创建 1 行。
    SQL> insert into cc values('六');
    已创建 1 行。
    SQL> insert into cc values('七');
    已创建 1 行。
    SQL>  insert into cc values('八');
    已创建 1 行。
    SQL> insert into cc values('九');
    已创建 1 行。
    SQL>  insert into cc values('十');
    已创建 1 行。
    SQL> select * from cc order by nlssort(b,'NLS_SORT=SCHINESE_PINYIN_M');
    说明:按拼音字母(英文字母)排序是ORACLE默认的排序方式,除非已经修改过
    B
    --------------------










    已选择10行。
    SQL> select * from cc order by nlssort(b,'NLS_SORT=SCHINESE_STROKE_M');
    B
    --------------------










    已选择10行。
    SQL>  select * from cc order by nlssort(b,'NLS_SORT=SCHINESE_RADICAL_M');
    B
    --------------------










    已选择10行。 
      

  2.   

    抱歉我可能解释的不是很清楚,我要做到的效果是,我有一个字段比如A,里面包含某些字符串内容如下  A
    adbd
    abcd
    hokl我要写个函数进行处理获得新的字段B  B
    abdd
    abcd
    hklo也就是说要将字段内容按字幕顺序排序
      

  3.   

    http://blog.csdn.net/jinjazz/archive/2009/01/20/3844336.aspx看这个了!
      

  4.   

    写了一个函数,不过有以下限制:
    1. oracle10g以上
    2. 字符串只能是字母,不能有空格和数字CREATE OR REPLACE FUNCTION orderchar(p_str VARCHAR2) 
    RETURN VARCHAR2 AS
      l_str VARCHAR2(100);
      l_array dbms_utility.uncl_array;
      l_tablen number;
      l_temp CHAR(1);
    BEGIN
      l_str := REGEXP_REPLACE(p_str,'(.)','\1,');
      l_str := SUBSTR(l_str, 1, LENGTH(l_str) - 1);
      DBMS_UTILITY.COMMA_TO_TABLE(l_str, l_tablen, l_array);FOR i IN 1..l_tablen LOOP
      FOR j IN 1..l_tablen-i LOOP
        IF l_array(j) > l_array(j+1) THEN
          l_temp := l_array(j);
          l_array(j) := l_array(j+1);
          l_array(j+1) := l_temp;
        END IF;
      END LOOP;
    END LOOP;  DBMS_UTILITY.TABLE_TO_COMMA(l_array, l_tablen, l_str);  RETURN REPLACE(l_str, ',', '');
    END;
    /
     select orderchar('china') from dual;
      

  5.   


    什么错,贴出来看看.另外下面这两点是否注意了1. oracle10g以上 
    2. 字符串只能是字母,不能有空格和数字和其他字符 
      

  6.   

    改进了一下,字符串中可以有空格和数据,但是不能有其他字符,如",@.()!等CREATE OR REPLACE FUNCTION orderchar(p_str VARCHAR2) 
    RETURN VARCHAR2 AS 
      l_str VARCHAR2(100); 
      l_array dbms_utility.uncl_array; 
      l_tablen number; 
      l_temp CHAR(1); 
    BEGIN 
      l_str := REGEXP_REPLACE(p_str,'(.)','q\1,'); 
      l_str := SUBSTR(l_str, 1, LENGTH(l_str) - 1); 
      DBMS_UTILITY.COMMA_TO_TABLE(l_str, l_tablen, l_array); FOR i IN 1..l_tablen LOOP 
      l_array(i) := SUBSTR(l_array(i),2);
    END LOOP; FOR i IN 1..l_tablen LOOP 
      FOR j IN 1..l_tablen-i LOOP 
        IF l_array(j) > l_array(j+1) THEN 
          l_temp := l_array(j); 
          l_array(j) := l_array(j+1); 
          l_array(j+1) := l_temp; 
        END IF; 
      END LOOP; 
    END LOOP;   DBMS_UTILITY.TABLE_TO_COMMA(l_array, l_tablen, l_str);   RETURN REPLACE(l_str, ',', ''); 
    END; 

      

  7.   

    zcs_1,对你的热心表示由衷的钦佩!
      

  8.   

    谢谢楼上,select orderchar('china') from dual;这句没有问题,
    但是如果是 select orderchar(A) from table 就不行了(A为字段名)
     select (select orderchar('china') from dual) as A from table 好像也不行请问是不是使用方法不对!谢谢