0

我有具有不同值的 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 
;
4

1 回答 1

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,因此可能不是总效率下降。

不过,真的,我不得不问你为什么要这样布置数据 - 任何语言的子字符串操作都很慢,数据库也不例外。为什么不使用另一列作为您的限制类型?为什么不在您当前正在查看的视图中进行布局呢?

于 2013-08-15T19:41:48.250 回答