oracel 排序含有字母的解决方式

原创 2013年12月04日 15:29:26

今天在工作时,涉及到一个排序工作

正常是 我是使用 oracle  的 to_number()

但是这个排序字段中 含有 字母

搜索了一下其他人的解决方案 

摘自 http://blog.csdn.net/luocm/article/details/2648559

本文介绍了判断字符串是否全为数字的4种办法,另外还介绍了一个translate函数的小技巧,从任意字符串中提取数字(调用2次translate函数)。这个办法是一个公司同事发现的,用起来很方便,但理解起来稍有点困难。
1、通过ASCII码判断是否数字,介于[48, 57]之间,(ascii('0') = 48, ascii('9') = '57')
2、调用cast函数尝试强制转换成NUMERIC或NUMBER,不是合法数字串即抛异常
3、调用translate函数,剔除所有[0-9]数字后,看是否为空串
4、调用正则表达式,进行模式匹配(10g版本新加入的功能)

    --通过ASCII码判断是否数字,介于[48, 57]之间,(ascii('0') = 48, ascii('9') = '57')  
    DECLARE  
        str             VARCHAR2(10) := '123a';  
        val             NUMERIC(10);  
        i               int;  
        k               int;  
        flag            BOOLEAN;  
    BEGIN  
        flag := TRUE;  
        for i in 1..10 loop   --新密码是否6位数字  
            k := ascii(substr(str, i, 1));  
            if k < 48 or k > 57 THEN  
                flag := FALSE;  
            end if;  
        end LOOP;  
          
        IF flag = true THEN  
            dbms_output.put_line(str || '是[0-9]的数字序列');  
        ELSE  
            dbms_output.put_line(str || '不是[0-9]的数字序列');  
        END IF;  
    END;  
      
    -- 调用cast函数尝试强制转换成NUMERIC或NUMBER,不是合法数字串即抛异常  
    DECLARE  
        str    VARCHAR2(10) := '123';  
        val    NUMERIC(10);  
    BEGIN  
        val := CAST(str AS NUMERIC);  
        dbms_output.put_line(str || '是[0-9]的数字序列');  
    EXCEPTION  
       WHEN value_error THEN -- 字符串转实数错误  
           --dbms_output.put_line(SQLCODE || ', ' || SQLERRM);  
           dbms_output.put_line(str || '不是[0-9]的数字序列');  
    END;  
      
    --调用translate函数,剔除所有[0-9]数字后,看是否为空串  
    DECLARE  
        str VARCHAR2(10) := '123abc';  
    BEGIN  
        IF replace(translate(str, '0123456789', '0'), '0', '') IS NULL THEN  
            dbms_output.put_line(str || '是[0-9]的数字序列');  
        ELSE  
            dbms_output.put_line(str || '不是[0-9]的数字序列');  
        END IF;  
    END;  
      
    --调用正则表达式,进行模式匹配(10g版本新加入的功能)  
    SELECT *  
    FROM dual  
    WHERE regexp_like('1234', '^[[:digit:]]+$');  
      
    --从任意字符串中提取数字串(调用2次translate函数)。  
    --假定初始串为str。首先将str中数字全部替换为空格,输出记为str2;  
    --其次,对每个在str中出现的任意str2串中字符,如果是str2的首字符则替换为空格,其它字符则全部剔除  
    DECLARE  
        --str    VARCHAR2(100) := ' 护照01浙江2     3昆 山4苏 3';  
        str    VARCHAR2(100) := ' 护照浙江     昆 山苏 4';  
        ret    VARCHAR2(10);  
    BEGIN  
        ret := TRIM(TRANSLATE(str, trim(TRANSLATE(str, '1234567890', '          ')), ' '));  
        dbms_output.put_line(ret);  
    END;  

上面的方式应该可以行但是 我想用最小的修改完成效果

所以 思考后  使用了 translate  替换相应字母为 数字

然后根据 这个字段进行排序

select  zydm, zymc, kskm, ordernum
  from (select c.id,
               a.zydm,
               a.zymc,
               b.yjfxm,
               b.yjfxmc,
               c.kskm,
               translate(a.zydm, 'ZJ', '99') as ordernum
          from mlcj_zy_info a, mlcj_yjfx_info b, mlcj_yjfx_kskm c
         where a.type = b.type
           and a.type = c.type
           and a.recruitno = b.recruitno
           and a.recruitno = c.recruitno
           and a.zydm = b.zydm
           and a.zydm = c.zydm
           and b.yjfxm = c.yjfxm
           and allflag = '1'
           and a.type = '0'
           and a.recruitno in
               (select id from mng_recruitno_info where mlcj_selected = '1'))
 order by to_number(ordernum) asc, zydm asc

注意 此处 原来是 使用 distinct 过滤  导致 结果排序乱掉了  后来我改成了 group by

oracle-字母数字混合排序

create view V as select ename || ||deptno as data from emp;select data from V order by replace...
  • changlang
  • changlang
  • 2009年04月08日 12:26
  • 3161

Java 集合排序---常用的2种排序方式、附代码实例(大师兄亲测)

Java API针对集合类型排序提供了两种支持: java.util.Collections.sort(java.util.List) java.util.Collections.sort(java....
  • qq_27093465
  • qq_27093465
  • 2016年08月31日 19:13
  • 1458

oracle字母和数字,小数点,数字符号组合排序(注意:难度比前一篇oracle字母和数字组合排序加大)

1.背景,处理汽车厂商配件图号信息时,里面的图中编号数据出现了字母和数字,数字,小数点,数字加符号加数字的数据。 厂商要求排序时能兼顾这几种场景: 一,厂商A的配件信息中图中编号(字母和数字组合)。 ...
  • leselon
  • leselon
  • 2016年12月29日 17:48
  • 461

c++ 字母排序

char a[123] = {'Z', 's', 'p', 'l', 'j', 'r', 'q', 'v', 'n', 'm', 'C', 'F', 'D', 'B', 'A', '2', '0', ...
  • sz76211822
  • sz76211822
  • 2015年06月29日 20:38
  • 894

强大的SQL之SQL Cookbook读书笔记1——对字母数字混合的数据排序

最近,在看SQL Cookbook真的很不错的一本书,许多解决方案,都十分精妙,真切的体会到了,SQL的强大。 注:我用的是ORACLE 11g 下面是书2.4中的一个实例--对字母数字混...
  • zhanglu0223
  • zhanglu0223
  • 2013年04月10日 20:46
  • 1814

含有大小写字母的字符串按照a-zA-Z排序

 http://dl2.csdn.net/down4/20070703/03123448474.java此类提高了字符串排序的方法,排序的效果:字符串:abcABCABCabc;排序后:aaAAbbB...
  • wbiao
  • wbiao
  • 2007年07月03日 12:37
  • 647

SQL 排序 . 有字母和数字的先按字母后按数字

select * from tb order by cast ( left([col1],patindex('%[^0-9]%',[col1]+',')-1 ) as int) ,[col1...
  • poloyzhang
  • poloyzhang
  • 2014年09月05日 09:56
  • 4705

javascript 自己实现数字\字母和中文的混合排序方法 by FungLeo

javascript 自己实现数字\字母和中文的混合排序方法(纯粹研究,不实用)前言在上一篇博文《javascript 数组排序sort方法和自我实现排序方法的学习小结》中,我用自己的方法实现了数字数...
  • FungLeo
  • FungLeo
  • 2016年06月04日 10:55
  • 9138

夹杂数字字母大小写的字符串排序方法

核心步骤概要过滤过滤数字等特殊符号,只剩下字母这里要用到String类自带的replaceAll方法以及表达式进行过滤分割将字符串进行单字符分割这里要用到String类自带的substring方法排序...
  • TeckerYu
  • TeckerYu
  • 2016年07月01日 17:19
  • 1101

Oracel中中文排序方式

1)按笔画排序 select * from Table order by nlssort(columnName,'NLS_SORT=SCHINESE_STROKE_M') 2)按部首排序 ...
  • ning109314
  • ning109314
  • 2011年10月26日 13:35
  • 359
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:oracel 排序含有字母的解决方式
举报原因:
原因补充:

(最多只允许输入30个字)