Iペアのキー値を含む列を有する:Oracleの文字列列から値を取得する方法は?
KEY1 = 111111を| KEY3 = 333333 | | KEY2 = 222222 KEY4 = 444444
値は、別のテーブル内の列のIDです。 key2が存在する場合、どのように値 '222222'を取得し、別のテーブルと結合するために使用できますか?
私にrexegを提供できますか?前もって感謝します。
Iペアのキー値を含む列を有する:Oracleの文字列列から値を取得する方法は?
KEY1 = 111111を| KEY3 = 333333 | | KEY2 = 222222 KEY4 = 444444
値は、別のテーブル内の列のIDです。 key2が存在する場合、どのように値 '222222'を取得し、別のテーブルと結合するために使用できますか?
私にrexegを提供できますか?前もって感謝します。
これが「適切な形式」である場合(1つの列に1つの値の代わりに2つの列に4つの行、つまりキーの列と値の列を持つ表)、簡単で正しい?そして、あなたの列が別の列とペアになっている場合、ある種の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
は文字列です。数値でなければならない場合は、to_number()
に最後のregexp_substr
をラップすることをお勧めします。
これで、t1
ではなく、このビューを使用するようにすべての結合を書きます。
*はデザインです、それは恐ろしいです。 – BobC
私はこの業界ではうまくいきませんが、この種のbsデータモデルは、特に古い、非常に大きな組織(病院、保険会社、銀行、...)おそらく、RDBMSが発明される前からであった。もちろん、何年も後にそれを修正しない理由はありませんが、これについて何の手がかりもなく、すべてに**ノー**と言うビジネスマネージャーに対処する必要があります。 – mathguy
残念ながら、これは新しいアプリケーションでもあまりにも一般的です。 「キーバリュー」ストアはパフォーマンスには優れており、「ファッショナブル」はもちろんのこと、スケーラビリティなどがあるという認識があります。 – BobC
KEYという列のテーブルとVALUEという列があるとしますか? – BobC
@BobCいいえ、列は "options"と呼ばれ、 "key1 = 111111 | key2 = 222222 | key3 = 333333 | key4 = 444444"のような文字列を含んでいます。ここでkeyは別のテーブルの列のIDです... –