我有一个包含一对键值的列:
键1 = 111111 |键2 = 222222 | KEY3 = 333333 | KEY4 = 444444
value是不同表中列的id。 我怎样才能获得价值' 222222'如果key2存在,然后用它来加入另一个表?
你能为我提供rexeg吗?提前谢谢。
答案 0 :(得分: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
。