2017-04-17 102 views
1

下面的Select語句返回附加的列。在這一點上一切都很好,但我仍然需要添加一些檢查。我需要:ORACLE SQL:使用SUBSTR構建CASE語句

  • 如果文本列包含一個時期的標誌,意味着我們有一個 OBJECT_OWNER/OBJECT_NAME然後告訴車主
  • 如果列文本不包含句號(。)(。)符號,意味着這是一個規則,那麼只有在OBJECT_NAME中沒有該部分(只有RULE名稱:ex:「R_FIRST」變成「R_FIRST」)而OBJECT_OWNER不應該包含任何內容(只是空白而不是像現在這樣顯示(NULL) );

目前查詢:

SELECT 
    SUBSTR(SUBSTR(TRIM(X.TEXT), 1, INSTR(TRIM(X.TEXT), '.')-1), 8) AS OBJECT_OWNER, 
    SUBSTR(TRIM(X.TEXT), INSTR(TRIM(X.TEXT), '.')+1) AS OBJECT_NAME, 
    TRIM(X.TEXT) TEXT 
    FROM 
    TABLE_X X 
    WHERE 
    SUBSTR(TRIM(X.TEXT), 1, 6) in ('<FROM>','<INTO>','<RULE>'); 

電流輸出:

OBJECT_OWNER  OBJECT_NAME  TEXT 
    SCHEMA100  T_PERSON   <INTO> SCHEMA100.T_PERSON 
    SCHEMA110  T_CLIENT   <FROM> SCHEMA110.T_CLIENT 
    (NULL)   <RULE> R_FIRST <RULE> R_FIRST 

所需的輸出:

OBJECT_OWNER  OBJECT_NAME  TEXT 
    SCHEMA100  T_PERSON   <INTO> SCHEMA100.T_PERSON 
    SCHEMA110  T_CLIENT   <FROM> SCHEMA110.T_CLIENT 
        R_FIRST   <RULE> R_FIRST 
+0

你可以添加問題你想要的輸出? – Seyran

+0

這也有助於展示輸入數據的一個例子。 – SandPiper

回答

0
SELECT 
    CASE WHEN INSTR(X.TEXT, '.') > 1 
     THEN SUBSTR(TRIM(X.TEXT), 8, INSTR(X.TEXT, '.') - 1) 
     ELSE NULL END AS OBJECT_OWNER, 
    CASE WHEN INSTR(X.TEXT, '.') > 1 
     THEN SUBSTR(TRIM(X.TEXT), INSTR(X.TEXT, '.') + 1), LEN(TRIM(X.TEXT))) 
     ELSE SUBSTR(TRIM(X.TEXT), 8, LEN(TRIM(X.TEXT))) END AS OBJECT_NAME, 
    X.TEXT 
FROM TABLE_X X 
WHERE SUBSTR(TRIM(X.TEXT), 1, 6) in ('<FROM>','<INTO>','<RULE>') 

這是幹什麼的,它在字符串中查看'。'字符出現。如果確實如此,則字符串位置將大於1.如果不是,則條件不滿足並且它轉到ELSE語句。

對於帶有句點的OBJECT_NAME,您必須在該句點之後開始解析。否則,你從字符8開始考慮你的標籤標籤。在這兩種情況下,您都可以使用字符串的全部長度,因爲如果到了最後,它總是會停下來。

此外,在大多數情況下,空值比空字符串更有用。確保你真的需要''而不是NULL作爲你在OBJECT_OWNER中的ELSE語句。如果你像這樣運行,NULL值應該顯示爲空白條目。我不知道爲什麼你在以前的結果集中獲得(NULL)

+0

非常感謝您的回答!檢查它,它完美的工作,正是我所需要的! – John

0

不知道,這是你想要

SELECT nvl(SUBSTR(SUBSTR(TRIM(X.TEXT), 1, INSTR(TRIM(X.TEXT), '.') - 1), 8), 
      '') AS OBJECT_OWNER, 
     SUBSTR(TRIM(X.TEXT), 
       decode(INSTR(TRIM(X.TEXT), '.'), 0, INSTR(TRIM(X.TEXT), '>'), 
         INSTR(TRIM(X.TEXT), '.')) + 1) AS OBJECT_NAME, 
     TRIM(X.TEXT) TXT 
    FROM TABLE_X X 
WHERE SUBSTR(TRIM(X.TEXT), 1, 6) in ('<FROM>', '<INTO>', '<RULE>');