2009-11-19 50 views
0

我有一個以下面的鍵值格式存儲在表中的字符串:「Key1☺Value1☺Key2☺Value2☺KeyN☺ValueN☺」。 給定一個關鍵點如何提取值?正則表達式是處理這個問題的最簡單方法嗎?我是PL/SQL和Regex的新手。使用正則表達式的PL/SQL鍵值字符串

+0

我在鍵值格式中看到了「笑臉」。那是什麼性格? – dcp 2009-11-19 20:21:39

+0

它是字符1 – Rodney 2009-11-19 20:30:33

+0

你的意思是管?例如 Key1,Value1 | Key2,Value2 | Key3,Value3 – dcp 2009-11-19 20:45:57

回答

0

在這種情況下,我只會使用常規拆分並遍歷所得到的數組。

public string GetValue(string keyValuePairedInput, string key, char separator) 
{ 
    var split = keyValuePairedInput.Split(separator); 

    if(split.Lenght % 2 == 1) 
     throw new KeyWithoutValueException(); 

    for(int i = 0; i < split.Lenght; i += 2) 
    { 
     if(split[i] == key) 
      return split[i + 1]; 
    } 

    throw new KeyNotFoundException(); 
} 

(這是沒有編制,而不是PL/SQL,無論如何,把它當作僞☺)

OK我聽到你的意見...... 利用的PL/SQL函數,你可能會能夠使用這樣的事情:

select 'key' as keyValue, 
(instr(keyValueStringField, keyValue) + length(keyValue) + 1) as valueIndex, 
substr(keyValueStringField, valueIndex, instr(keyValueStringField, '\1', valueIndex) - valueIndex) as value 
from Table 
+0

這看起來像java,而不是pl/sql。 – Rodney 2009-11-19 20:33:47

0

對於這種類型的字符串切片和PL/SQL切割你可能會使用正則表達式。 Oracle有許多可以使用的regular expression functions。最常用的是REGEXP_LIKE,它與LIKE運營商非常相似,但可進行RegEx匹配。

但是你可能需要使用REGEXP_INSTR找到位置,其中分離,然後用SUBSTR功能在匹配的位置切了繩子。您也可以考慮使用REGEXP_SUBSTR,它可以一步完成RegEx匹配和切片。

0

作爲替代正則表達式...

假設你有一個輸入像這樣: 鍵1,值1 |鍵2,值2 |鍵3,值3

你可以使用一些PL/SQL作爲如下圖所示:

FUNCTION get_value_by_key 
    (
     p_str   VARCHAR2 
    , p_key   VARCHAR2 
    , p_kvp_separator VARCHAR2 
    , p_kv_separator VARCHAR2 
    ) RETURN VARCHAR2 
    AS 
     v_key VARCHAR2(32767); 
     v_value VARCHAR2(32767); 
     v_which NUMBER;  
     v_cur VARCHAR(1); 
    BEGIN 
     v_which := 0; 
     FOR i IN 1..length(p_str) 
     LOOP 
     v_cur := substr(p_str,i,1);   
     IF v_cur = p_kvp_separator 
     THEN 
      IF v_key = p_key 
      THEN 
       EXIT; 
      END IF; 
      v_key := ''; 
      v_value := ''; 
      v_which := 0; 
     ELSIF v_cur = p_kv_separator 
     THEN 
      v_which := 1; 
     ELSE 
      IF v_which = 0 
      THEN 
       v_key := v_key || v_cur; 
      ELSE 
       v_value := v_value || v_cur; 
      END IF; 
     END IF; 
     END LOOP; 

     IF v_key = p_key 
     THEN 
     RETURN v_value; 
     END IF; 
     raise_application_error(-20001, 'key not found!');  
    END; 

要獲取價值「鍵2」你可以這樣做(假設你的函數是在一個包叫做test_pkg):

SELECT test_pkg.get_value_by_key('Key1,Value1|Key2,Value2|Key3,Value3','Key2','|',',') FROM dual