日期:2014-05-17  浏览次数:21003 次

根据某一字段排序问题
如有A字段,下面有:
'第1行数据'
'第22行数据'
'第3行数据'
'这是新的5行数据'
这样4列
问:怎样才能排成这样的序?
'第1行数据'
'第3行数据'
'这是新的5行数据'
'第22行数据'

------解决方案--------------------
select *
from tablename tn
 order by translate(A,'1234567890这是新的第行数据','1234567890');

------解决方案--------------------
FUNCTION f_numeric_check(p_str IN VARCHAR2) RETURN BOOLEAN IS
i NUMBER;
v_char VARCHAR2(2);
BEGIN
i := 1;
LOOP
v_char := substr(p_str, i, 1);
EXIT WHEN v_char IS NULL;
IF ascii(v_char) < 48 OR ascii(v_char) > 57 THEN
RETURN FALSE;
END IF;
i := i + 1;
END LOOP;
RETURN TRUE;
END f_numeric_check;

------解决方案--------------------
先写一个提取字符串中数值的函数,然后再order by排序:
create or replace function getnum(ss in varchar2) return number as
v_ss varchar2(9999);
v_str varchar2(1);
v_num number(38);
n number(5);
begin
v_ss:=ss;
select length(v_ss) into n from dual;
for i in 1..n loop
v_str:=substr(v_ss,i,1);
if v_str<>'0' and v_str<>'1' and v_str<>'2' and v_str<>'3' and v_str<>'4' and
v_str<>'5' and v_str<>'6' and v_str<>'7' and v_str<>'8' and v_str<>'9' then
v_ss:=replace(v_ss,v_str,'*');
end if;
end loop;
v_ss:=replace(v_ss,'*','');
v_num:=to_number(v_ss);
return v_num;
end getnum;
/

查询:
select a from t order by getnum(a);