2008年11月17日 星期一

Sorting an alphanumeric column in Oracle10g


/*
  sorting alphanumeric column.
  say, column COL1 values with below:
  C1
  C2
  C3
  C10
  after order by COL1,it turns out to be
  C1
  C10
  C2
  C3
  but it should be
  C1
  C2
  C3
  C10
*/


/* create testing table */

CREATE TABLE TEST
(
  COL0 CHAR(3)
);

/* insert testing data */

INSERT INTO TEST VALUES ('C1');
INSERT INTO TEST VALUES ('C2');
INSERT INTO TEST VALUES ('C3');
INSERT INTO TEST VALUES ('C4');
INSERT INTO TEST VALUES ('C5');
INSERT INTO TEST VALUES ('C6');
INSERT INTO TEST VALUES ('C7');
INSERT INTO TEST VALUES ('C8');
INSERT INTO TEST VALUES ('C9');
INSERT INTO TEST VALUES ('C10');
INSERT INTO TEST VALUES ('C11');
INSERT INTO TEST VALUES ('C12');
INSERT INTO TEST VALUES ('C13');
INSERT INTO TEST VALUES ('CE1');
INSERT INTO TEST VALUES ('CE2');
INSERT INTO TEST VALUES ('E1');
INSERT INTO TEST VALUES ('B8');
INSERT INTO TEST VALUES ('BE1');
INSERT INTO TEST VALUES ('BE2');
INSERT INTO TEST VALUES ('CE');
INSERT INTO TEST VALUES ('教');
INSERT INTO TEST VALUES ('教1');
INSERT INTO TEST VALUES ('教2');
INSERT INTO TEST VALUES ('教10');

/* using TRANSLATE Function to separate alphabets and numbers */

SELECT COL0 FROM
(
SELECT COL0,
    TRIM(TRANSLATE(COL0,'1234567890',' ')) COL1,
    TO_NUMBER(COALESCE(TRIM(TRANSLATE(COL0,
                       TRANSLATE(COL0,'1234567890',' '),
                       ' ')
               ),NULL,'0')) COL2
FROM TEST
) T
ORDER BY COL1,COL2;

/* The Result */

COL0
--------
B8
BE1
BE2
C1
C2
C3
C4
C5
C6
C7
C8
C9
C10
C11
C12
C13
CE
CE1
CE2
E1

教1
教2
教10