2017-04-17 100 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>');