请问在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中怎么写呢?
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中怎么写呢?
在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行。
adbd
abcd
hokl我要写个函数进行处理获得新的字段B B
abdd
abcd
hklo也就是说要将字段内容按字幕顺序排序
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;
什么错,贴出来看看.另外下面这两点是否注意了1. oracle10g以上
2. 字符串只能是字母,不能有空格和数字和其他字符
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;
/
但是如果是 select orderchar(A) from table 就不行了(A为字段名)
select (select orderchar('china') from dual) as A from table 好像也不行请问是不是使用方法不对!谢谢