SQL平常問題和技巧2(自定義排序,遞歸查詢,異常ORA-01747,逗號隔開的字符串轉成in條件,用符號鏈接表中某字段)

1.有些狀況須要將幾條記錄按要求排序,適用於少許要求oracle

表如圖所示:函數

按照e,u,r,o,t,w,q,y,i順序排序:spa

 1 SELECT
 2     * 
 3 FROM
 4     LGQ_TEST 
 5 ORDER BY
 6     (
 7     CASE
 8             
 9             WHEN s = 'e' THEN
10             1 
11             WHEN S = 'u' THEN
12             2 
13             WHEN S = 'r' THEN
14             3 
15             WHEN S = 'o' THEN
16             4 
17             WHEN S = 't' THEN
18             5 
19             WHEN S = 'W' THEN
20             6 
21             WHEN S = 'q' THEN
22             7 
23             WHEN S = 'y' THEN
24             8 
25             WHEN S = 'i' THEN
26             9 ELSE 0 
27     END 
28     )

 2.遞歸查詢(遞歸子孫和遞歸祖先)code

 1 -- 遞歸子孫
 2 SELECT
 3     pur.CODE 
 4 FROM
 5     PUB_REGION pur START WITH pur.CODE = '370000000000' CONNECT BY PRIOR pur.CODE = pur.PARENT_CODE
 6     
 7 -- 遞歸祖先
 8     SELECT
 9     pur.CODE 
10 FROM
11     PUB_REGION pur START WITH pur.CODE = '370100000000' CONNECT BY PRIOR pur.PARENT_CODE=pur.CODE

 3.異常:ORA-01747: user.table.column, table.column 或列說明無效regexp

由於用了oracle關鍵字blog

4.將用逗號隔開的字符串轉成in條件排序

SELECT
    regexp_substr( TO_CHAR( 'id1,id2,id3' ), '[^,]+', 1, LEVEL ) 
FROM
    dual CONNECT BY regexp_substr( TO_CHAR( 'id1,id2,id3' ), '[^,]+', 1, LEVEL ) IS NOT NULL

結果爲:遞歸

 1 --使用
 2 SELECT
 3     * 
 4 FROM
 5 TABLE 
 6 WHERE
 7     TABLE.ID IN (
 8     SELECT
 9         regexp_substr( TO_CHAR( 'id1,id2,id3' ), '[^,]+', 1, LEVEL ) 
10 FROM
11     dual CONNECT BY regexp_substr( TO_CHAR( 'id1,id2,id3' ), '[^,]+', 1, LEVEL ) IS NOT NULL)

 5.用自定義符號鏈接表中某字段,函數LISTAGG()字符串

這個例子是吧這個表中全部記錄的id用--鏈接起來table

1 SELECT
2     LISTAGG(PI.ID,'--') WITHIN GROUP(ORDER BY PI.ID DESC) AS STR
3 FROM
4     PROJECT_INFO PI 
5 WHERE
6     1=1

結果爲:

相關文章
相關標籤/搜索