1. 程式人生 > >強大的SQL之SQL Cookbook讀書筆記1——對字母數字混合的資料排序

強大的SQL之SQL Cookbook讀書筆記1——對字母數字混合的資料排序

最近,在看SQL Cookbook真的很不錯的一本書,許多解決方案,都十分精妙,真切的體會到了,SQL的強大。

注:我用的是ORACLE 11g

下面是書2.4中的一個例項--對字母數字混合的資料序列的排序

首先,我們需要書中的一張表emp,書中沒有提供建表的檔案或者是語句。我用的是ORACLE資料庫,按照書上的資料自己建的emp表,隨便建一個表,然後把資料存起來,下面是資料插入的SQL,你們有福啦,就不要一條條輸入了,PS:本來想上傳emp表的dump檔案的,可是上傳限制。

insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7369, 'SMITH', 'CLERK', 7902, '17-DEC-1980', 800, null, 20);

insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7499, 'ALLEN', 'SALESMAN', 7698, '20-FEB-1981', 1600, 300, 30);

insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7521, 'WARD', 'SALESMAN', 7698, '20-FEB-1981', 1250, 500, 30);

insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7566, 'JONES', 'MANAGER', 7839, '02-APR-1981', 2975, null, 20);

insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7654, 'MARTIN', 'SALESMAN', 7698, '28-SEP-1981', 1250, 1400, 30);

insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7698, 'BLAKE', 'MANAGER', 7839, '01-MAY-1981', 2850, null, 30);

insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7782, 'CLARK', 'MANAGER', 7839, '09-JUN-1981', 2450, null, 10);

insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7788, 'SCOTT', 'ANALYST', 7566, '09-DEC-1982', 3000, null, 20);

insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7839, 'KING', 'PRESIDENT', null, '17-NOV-1981', 5000, null, 10);

insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7844, 'TURNER', 'SALESMAN', 7698, '08-SEP-1981', 1500, 0, 30);

insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7876, 'ADAMS', 'CLERK', 7788, '12-JAN-1983', 1100, null, 20);

insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7900, 'JAMES', 'CLERK', 7698, '03-DEC-1981', 950, null, 30);

insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7902, 'FORD', 'ANALYST', 7566, '03-DEC-1981', 3000, null, 20);

insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7934, 'MILLER', 'CLERK', 7782, '23-JAN-1982', 1300, null, 10);

建好表,插好資料,然後,建一個檢視,語句如下,

CREATE VIEW v
AS
SELECT ename||' '||deptno AS DATA
FROM emp

接著,就是要通過建立的檢視v裡面的字母或者數字,排序查詢結果,如何做呢?

1. 分離出數字,通過數字(DEPTNO)排序查詢結果,經ORACLE資料庫驗證,可行,SQL如下:

SELECT DATA
  FROM V
 ORDER BY REPLACE(DATA,
                  REPLACE(TRANSLATE(DATA, '0123456789', '##########'),
                          '#',
                          ''),
                  '');

2. 分離出字母,通過字母(ENAME)排序查詢結果,經ORACLE資料庫驗證,可行,SQL如下:
SELECT DATA
  FROM V
 ORDER BY REPLACE(TRANSLATE(DATA, '0123456789', '##########'), '#', '');
我看的時候,就感覺分離出來的字母,後面多一個空格,於是看到了書中的分離檢視(VIEW)的查詢語句,證實,我的想法是正確的,查詢語句如下
SELECT DATA,
       REPLACE(DATA,
               REPLACE(TRANSLATE(DATA, '0123456789', '##########'), '#', ''),
               '') NUMS,
       REPLACE(TRANSLATE(DATA, '0123456789', '##########'), '#', '') CHARS
  FROM V;
把分離查詢出來的欄位CHARS中的值拷貝,粘貼出來,確實後面多個空格。

SQL,如此強大,學到了,哈哈。