PL / SQL - выбрать значения столбцов как строковый массив - PullRequest
2 голосов
/ 03 февраля 2012

Я не уверен, задавался ли этот вопрос ранее. Я не уверен, как это выразить. Но я объясню со сценарием.
У меня есть следующие таблицы
TAB1 с колонками: USERID, CODE, COUNTRY
TAB2 с колонками: USERID, CODE, EMAIL

Пример содержимого:

TAB1:
RISHI, A1B2C3, INDIA
RISHI, D2E3F4, INDIA
KANTA, G3H4I5, INDONESIA

TAB2:
RISHI, A1B2C3, rishi1@test.com
RISHI, A1B2C3, rishi2@test.com
RISHI, A1B2C3, rishi3@test.com
RISHI, D2E3F4, rishi1@test.com
RISHI, D2E3F4, rishi2@test.com
KANTA, G3H4I5, kanta1@test.com

То, что я хочу от запроса выбора или хранимой процедуры pl / sql, является результатом, подобным этому:

RISHI, INDIA, A1B2C3, (rishi1@test.com, rishi2@test.com, rishi3@test.com)
RISHI, INDIA, D2E3F4, (rishi1@test.com, rishi2@test.com)

Если я сделаю выбор, например:

select a.userid, a.code, a.country, b.email
from tab1.a, tab2.b
where a.userid = b.userid
and a.code = b.code
and a.userid = 'RISHI';

Я получаю результат как:

RISHI, INDIA, A1B2C3, rishi1@test.com
RISHI, INDIA, A1B2C3, rishi2@test.com
RISHI, INDIA, A1B2C3, rishi3@test.com
RISHI, INDIA, D2E3F4, rishi1@test.com
RISHI, INDIA, D2E3F4, rishi2@test.com

Что мне в основном нужно, так это идентификаторы электронной почты, сгруппированные в массив. Предположим, что TAB1 содержит гораздо больше столбцов, которые мне действительно нужны, но в этом примере я опущен, а в TAB2 есть только эти три столбца.

Ответы [ 2 ]

1 голос
/ 03 февраля 2012
select a.userid, a.code, a.country, listagg(b.email, ',') within group (order by b.email) as "Emails"
from tab1.a, tab2.b
where a.userid = b.userid
and a.code = b.code
and a.userid = 'RISHI'
group by a.userid, a.code, a.country;
0 голосов
/ 03 февраля 2012

Я думаю, что вы хотите использовать агрегатную функцию GROUP_CONCAT в MySQL. Плохая новость заключается в том, что в Oracle нет встроенной функции для конкатенации групп, а хорошая новость заключается в том, что вы можете эмулировать такую ​​функцию, как эта.

Посмотрите на этот фрагмент:

with data
     as
     (
          select job,
                ename,
                row_number() over (partition by job order by ename) rn,
                count(*) over (partition by job) cnt
      from emp
     )
 select job, ltrim(sys_connect_by_path(ename,','),',') scbp
  from data
  where rn = cnt
  start with rn = 1
  connect by prior job = job and prior rn = rn-1
  order by job

и вернется

JOB       SCBP
--------- ----------------------------------------
ANALYST   FORD,SCOTT
CLERK     ADAMS,JAMES,MILLER,SMITH
MANAGER   BLAKE,CLARK,JONES
PRESIDENT KING
SALESMAN  ALLEN,MARTIN,TURNER,WARD

ССЫЛКА

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...