搜索列中的特定字符,然后从中创建不同的列

时间:2013-08-15 19:04:58

标签: regex oracle11g

我的param_Value列有不同的值。我需要提取这些值并为所有这些值创建列。

  |PARAM_NAME |param_Value |
    __________|____________
  |Step 4     |  SP:0.09   |
  |Procedure  |  MAX:125   |
  |Step 4     |  SP:Ambient|
  |(null)     |  +/-:N/A   |
  |Steam      |  SP:2      |
  |Step 3     |  MIN:0     |
  |Step 4     |  RDPHN427B |
  |Testing De |  N/A       |

我只想要列:并给它们起名字:

  SP:                SET_POINT_VALUE,
  MAX:               MAX_LIMIT,
  MIN:               MIN_LIMIT,
  +/-:               UPPER_LOWER_LIMIT

所以到目前为止我所拥有的是:

CREATE OR REPLACE FORCE VIEW PROCESS_STEPS 
("PARAM_NAME", "SET_POINT_VALUE", "UPPER_LOWER_LIMIT", "MAX_VALUE", "MIN_VALUE")
AS
SELECT PARAM_NAME,        
       REGEXP_LIKE("param_Value", 'SP:')   SET_POINT_VALUE,
       REGEXP_LIKE("param_Value", '+/-:') UPPER_LOWER_LIMIT,
       REGEXP_LIKE("param_Value", 'MAX:')  MAX_VALUE,
       REGEXP_LIKE("param_Value", 'MIN:')  MIN_VALUE
FROM PROCESS_STEPS 
;

1 个答案:

答案 0 :(得分:1)

我对TSQL和MySQL更熟悉,但这应该是我认为你正在寻找的。如果不完全相同,它至少应该指向正确的方向。

CREATE OR REPLACE FORCE VIEW PROCESS_STEPS 
    ("PARAM_NAME", "SET_POINT_VALUE", "UPPER_LOWER_LIMIT", "MAX_VALUE", "MIN_VALUE")
AS
SELECT PARAM_NAME  
        , CASE WHEN "param_Value" LIKE 'SP:%'
            THEN SUBSTR("param_Value", INSTR("param_Value", ':')+1)
            ELSE Null
        END SET_POINT_VALUE
        , CASE WHEN "param_Value" LIKE '+/-:%'
            THEN SUBSTR("param_Value", INSTR("param_Value", ':')+1)
            ELSE Null
        END UPPER_LOWER_LIMIT
        , CASE WHEN "param_Value" LIKE 'MAX:%'
            THEN SUBSTR("param_Value", INSTR("param_Value", ':')+1)
            ELSE Null
        END MAX_VALUE
        , CASE WHEN "param_Value" LIKE 'MIN:%'
            THEN SUBSTR("param_Value", INSTR("param_Value", ':')+1)
            ELSE Null
        END MIN_VALUE
    FROM PROCESS_STEPS
;

这里的基本概念是通过LIKE识别您想要的信息,然后使用SUBSTR和INSTR来提取它。虽然LIKE通常是远离某些东西的,但由于在你的情况下没有领先%,它是Sargable,因此可能不是总效率下降。

但是,我必须要求您质疑为什么要像这样布置数据 - 子字符串操作在任何语言中都很慢,并且数据库也不例外。为什么不使用其他列作为限制类型?为什么不在你目前正在看的视图中列出来?