1

Oracle データベースの列からカンマ区切りの文字列を解析し、それぞれを別のテーブルへの結合として使用するにはどうすればよいですか

例:

     Table 1                    Table 2

 ID      Name                  ID       Rate
 ---    ------                ----     ------
 1,2,3  FISRT                   1        90
                                2        80      
                                3        70

テーブル 1 から各 ID を抽出してテーブル 2 に結合したい場合、次のようになります。

extract(tbl1.ID, i) = tbl2.ID

前もって感謝します。

4

3 に答える 3

1

この回答に基づいて、この ようなことができます

select *
from table1 t1 join table2 t2 on ','||t1.id||',' like '%,'||t2.id||',%'

ここにsqlfiddleがあります

于 2013-09-03T07:13:40.423 に答える
0

アイデアとコメントをありがとうございました。おそらく、解析された文字列に参加する必要はありません。「REGEXP_LIKE」のようなものを見つけました。以下は私が試したものです。これは、2 つのテーブルを結合したのと同じでしょうか?

SELECT t2.id, t2.rate
  FROM table1 t1, table2 t2
    WHERE (REGEXP_LIKE(t1.id,
                ',' || t2.id || ',|^' || t2.id || ',|,' || t2.id ||
                '$|^' || t2.id || '$'))
于 2013-09-03T08:34:11.230 に答える
0

一般的な方法は、階層クエリと REGEXP_SUBSTR を使用することです。行が 1 つあれば、これで問題ありません。複数ある場合は問題があります。

以下は、カンマ区切りの文字列を解析します。

 select regexp_substr(:txt, '[^,]+', 1, level)
   from dual
connect by regexp_substr(:txt, '[^,]+', 1, level) is not null

ただし、一度に複数の操作を行う場合は、DISTINCT を追加する必要があります。 listagg 関数のエントリの複製を参照してください。

これを JOIN で使用できます。

with the_rows as (
 select distinct regexp_substr(col, '[^,]+', 1, level) as id
   from table1
connect by regexp_substr(col, '[^,]+', 1, level) is not null
        )
 select *
   from table2 a
   join the_rows b
     on a.id = b.id

これは恐ろしい方法です。階層クエリを使用してから、DISTINCT に固有の並べ替えを使用しています。それはあなたが得ることができるほど効率的ではありません。テーブルを正規化する必要があります。

于 2013-09-03T07:02:10.897 に答える