2017-02-12 84 views
-1

我有一個包含一對鍵值柱:如何從Oracle中的字符串序列列中獲取值?

鍵1 = 111111 |鍵2 = 222222 | KEY3 = 333333 | KEY4 = 444444

值是在不同的表中的列的標識。 如果key2存在,如何獲得值'222222',然後用它與另一個表連接?

你能爲我提供rexeg嗎?提前致謝。

+0

你是說你有一個名爲KEY的列和名爲VALUE的列? – BobC

+0

@BobC否,列被稱爲「選項」,它包含類似「key1 = 111111 | key2 = 222222 | key3 = 333333 | key4 = 444444」的字符串,其中key是另一個表中的列的ID ... –

回答

1

如果這是在「適當的形式」(而不是一列中的一個值,你會在兩列中有四行 - 一個表的鍵列和另一個值的列),那麼它會很容易,對?而且 - 如果你的專欄與另一專欄,某種id配對,那麼同一專欄應該在「正確的形式」表中?

我永遠不知道人們最終不得不使用類似「你的」現有專欄的東西。但是如果你沒有權力,寫一個視圖是最有意義的(可能是爲了更好的性能而物化),並使用它來代替當前的表。例如:

create table t1 (id number, key_val varchar2(4000)); 
insert into t1 
    select 101, 'key1=111111|key2=222222|key3=333333|key4=444444' from dual union all 
    select 102, 'key1=800001|key5=800002|key6=900030|key9=339900' from dual; 
commit; 

create view t1_view (id, key, val) as (
    select id, regexp_substr(key_val, '(\||^)(.*?)=', 1, level, null, 2), 
      regexp_substr(key_val, '=(.*?)(\||$)', 1, level, null, 1) 
    from t1 
    connect by level <= length(key_val) - length(translate(key_val, 'z=', 'z')) 
     and prior id = id 
     and prior sys_guid() is not null 
); 

select * from t1_view; 

    ID KEY VAL 
---- ----- ------- 
101 key1 111111 
101 key2 222222 
101 key3 333333 
101 key4 444444 
102 key1 800001 
102 key5 800002 
102 key6 900030 
102 key9 339900 

8 rows selected. 

這裏val仍然是一個字符串。如果它應該是一個數字,最好將最後的regexp_substr包裝在to_number()之內。

現在編寫所有的連接以使用此視圖而不是t1

+1

如果這*真的*是設計,這太可怕了。這是完全錯誤地使用產品的經典案例 – BobC

+1

我並不在行業工作,但我被告知這種bs數據模型非常普遍,尤其是在老的,非常大的組織(醫院,保險公司,銀行......)也許從RDBMS發明之前。當然,沒有理由在這麼多年後不去修復它,但是必須與那些對這一切毫無頭緒的業務經理打交道,並且對任何事情都說**不行。 – mathguy

+0

不幸的是,這在新的應用程序中也太常見了。有一種看法認爲,「關鍵價值」商店對性能有好處,可擴展等,更不用說「時髦」了。 – BobC

相關問題