2

次の形式のテーブルがあります。

DB_KEY     DB_VALUE
------     --------
row1       value1
row2;1     value2
row2;2     value3
row3       value4
row4;1     value5
row4;2     value6
row4;3     value7

DB_VALUE 列のみを返したいのですが、DB_KEY の最初の部分 (セミコロンの前) がどの行でも同じである場合は、行をマージします。したがって、上記の例の戻り値は次のようになります。

value1
value2value3
value4
value5value6value7

group by で何とかしようと思ったのですが、グループ化している列が選択されていないと使えないようです。すなわち:

SELECT DB_VALUE FROM TABLE GROUP BY REXEP_SUBSTR(DB_KEY, ';', 1, 1)

どんな提案でも大歓迎です。

4

3 に答える 3

1

あなたはこのようなことをすることができます

SQL> ed
Wrote file afiedt.buf

  1  with x as (
  2    select 'row1' db_key, 'value1' db_value from dual union all
  3    select 'row2;1', 'value2' from dual union all
  4    select 'row2;2', 'value3' from dual union all
  5    select 'row3', 'value4' from dual union all
  6    select 'row4;1', 'value5' from dual union all
  7    select 'row4;2', 'value6' from dual union all
  8    select 'row4;3', 'value7' from dual
  9  )
 10  select key,
 11         max( sys_connect_by_path(db_value, ' '))
 12             keep( dense_rank last order by curr ) db_value
 13    from (select key,
 14                 db_value,
 15                 row_number() over (partition by key
 16                                        order by db_value) curr,
 17                 row_number() over (partition by key
 18                                        order by db_value) - 1 prev
 19            from (select substr( db_key,
 20                                 1,
 21                                 (case when instr( db_key, ';' ) = 0
 22                                       then length(db_key)
 23                                       else instr( db_key, ';' ) - 1
 24                                   end)) key,
 25                          db_value
 26                     from x))
 27     group by key
 28   connect by prev = PRIOR curr and key = prior key
 29*    start with curr = 1
SQL> /

KEY                      DB_VALUE
------------------------ ------------------------------
row1                      value1
row2                      value2 value3
row3                      value4
row4                      value5 value6 value7

Oracleのさまざまな文字列集約手法をリストしたTimHallのページもご覧ください。Oracle 11.2を使用している場合、または関数や型を作成できる場合は、同じ出力を生成するより単純なクエリを生成できるはずです。

于 2012-04-05T00:53:40.130 に答える
0

WM_CONCAT を使用してこれを実現できますが、すべての人がこの関数を承認しているわけではありません。WM_CONCAT の代わりに、Oracle の新しいバージョンで使用できる他の連結関数を使用できます。


SELECT DISTINCT (SELECT DISTINCT NVL(WM_CONCAT(DB1.DB_VALUE), DB.DB_VALUE)
                   FROM DB_BUFFER DB1
                  WHERE SUBSTR(DB1.DB_KEY, 0, INSTR(DB1.DB_KEY, ';') - 1) =
                        SUBSTR(DB.DB_KEY, 0, INSTR(DB.DB_KEY, ';') - 1)) AS DB_VALUE
  FROM DB_BUFFER DB

これにより、DB_KEY 部分の開始 (; の前) がチェックされます。一致する場合、すべての値が 1 つの文字列に結合されます。

于 2012-04-11T06:52:44.847 に答える
0

Oracle の "group_concat" 集計関数を作成する場合は、それをクエリで使用して目的の結果を得ることができます。AskTom と group concat を検索すると、いたるところに定義が見つかります。ここに一例があります: http://kb.yarmakconsulting.com/2008/06/oracle-analog-of-mysql-groupconcat.html

階層クエリでもこれを行うことができると思います。

于 2012-04-04T23:53:35.683 に答える