一般排序都是依某個欄位來排序,但是如果還要讓登入使用者的單位排在最前面要如何做呢?
前言
一般排序都是依某個欄位來排序,但是如果還要讓登入使用者的單位排在最前面要如何做呢?
研究
先準備資料(單位、單位人員)
--單位檔CREATE TABLE DEPT_INFO(DEPT_ID NVARCHAR(100),DEPT_NAME NVARCHAR(200))--單位使用者資料檔CREATE TABLE USER_INFO(DEPT_ID NVARCHAR(100),USR_ID NVARCHAR(100),USR_NAME NVARCHAR(200))--增加部門資料INSERT INTO DEPT_INFO VALUES('DEPT_001', '部門001');INSERT INTO DEPT_INFO VALUES('DEPT_003', '部門003');INSERT INTO DEPT_INFO VALUES('DEPT_002', '部門002');INSERT INTO DEPT_INFO VALUES('DEPT_004', '部門004');INSERT INTO DEPT_INFO VALUES('DEPT_007', '部門007');INSERT INTO DEPT_INFO VALUES('DEPT_005', '部門005');--增加單位使用者資料INSERT INTO USER_INFO VALUES('DEPT_007', 'USER_001', '使用者001');INSERT INTO USER_INFO VALUES('DEPT_001', 'USER_002', '使用者002');INSERT INTO USER_INFO VALUES('DEPT_007', 'USER_003', '使用者003');INSERT INTO USER_INFO VALUES('DEPT_002', 'USER_005', '使用者005');INSERT INTO USER_INFO VALUES('DEPT_001', 'USER_004', '使用者004');INSERT INTO USER_INFO VALUES('DEPT_003', 'USER_006', '使用者006');INSERT INTO USER_INFO VALUES('DEPT_005', 'USER_007', '使用者007');INSERT INTO USER_INFO VALUES('DEPT_001', 'USER_008', '使用者008');INSERT INTO USER_INFO VALUES('DEPT_005', 'USER_009', '使用者009');INSERT INTO USER_INFO VALUES('DEPT_001', 'USER_010', '使用者010');INSERT INTO USER_INFO VALUES('DEPT_003', 'USER_011', '使用者011');INSERT INTO USER_INFO VALUES('DEPT_002', 'USER_012', '使用者012');INSERT INTO USER_INFO VALUES('DEPT_007', 'USER_013', '使用者013');INSERT INTO USER_INFO VALUES('DEPT_005', 'USER_014', '使用者014');INSERT INTO USER_INFO VALUES('DEPT_001', 'USER_015', '使用者015');INSERT INTO USER_INFO VALUES('DEPT_002', 'USER_016', '使用者016');
方法一,使用使用 UNION ALL
--以USER_011(DEPT_003) --方法1:使用 UNION ALL SELECT B.* FROM DEPT_INFO A, USER_INFO B WHERE A.DEPT_ID = B.DEPT_ID AND A.DEPT_ID = (SELECT Z.DEPT_ID FROM USER_INFO Z WHERE Z.USR_ID = 'USER_011') UNION ALL SELECT B.* FROM DEPT_INFO A, USER_INFO B WHERE A.DEPT_ID = B.DEPT_ID AND A.DEPT_ID NOT IN (SELECT Z.DEPT_ID FROM USER_INFO Z
但是以上的方式,會導致其他單位無法排序!
方法二,使用CASE WHEN 設定排序欄位
--以USER_011(DEPT_003) --方法2:使用CASE WHEN 設定排序欄位 SELECT B.* FROM DEPT_INFO A, USER_INFO B WHERE A.DEPT_ID = B.DEPT_ID ORDER BY CASE WHEN B.DEPT_ID = (SELECT Z.DEPT_ID FROM USER_INFO Z WHERE Z.USR_ID = 'USER_011') THEN 0 ELSE 1 END, B.DEPT_ID
以CASE WHEN來搞就比較OK了!
範例程式
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^