我有一個包含一對鍵值柱:如何從Oracle中的字符串序列列中獲取值?
鍵1 = 111111 |鍵2 = 222222 | KEY3 = 333333 | KEY4 = 444444
值是在不同的表中的列的標識。 如果key2存在,如何獲得值'222222',然後用它與另一個表連接?
你能爲我提供rexeg嗎?提前致謝。
我有一個包含一對鍵值柱:如何從Oracle中的字符串序列列中獲取值?
鍵1 = 111111 |鍵2 = 222222 | KEY3 = 333333 | KEY4 = 444444
值是在不同的表中的列的標識。 如果key2存在,如何獲得值'222222',然後用它與另一個表連接?
你能爲我提供rexeg嗎?提前致謝。
如果這是在「適當的形式」(而不是一列中的一個值,你會在兩列中有四行 - 一個表的鍵列和另一個值的列),那麼它會很容易,對?而且 - 如果你的專欄與另一專欄,某種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
。
你是說你有一個名爲KEY的列和名爲VALUE的列? – BobC
@BobC否,列被稱爲「選項」,它包含類似「key1 = 111111 | key2 = 222222 | key3 = 333333 | key4 = 444444」的字符串,其中key是另一個表中的列的ID ... –