#sql #oracle #oracle11g
#sql #Oracle #oracle11g
Вопрос:
Я использовал следующую команду.
select col1, col2, XMLAGG(XMLELEMENT(E, colname || ',')).EXTRACT('//text()')
from table
group by col1, col2
вывод:
col1 col2 col3
KOCHI ERNAKULAM residential, commercial, residential, residential
Но мне нужен следующий вывод как
col3 :
residential, commercial.
Я попытался использовать DISTINCT в подзапросе, но не получил требуемого результата. Любая помощь?
Комментарии:
1. Да. Oracle Database 11g Enterprise Edition Выпуск 11.2.0.3.0
Ответ №1:
как насчет использования regexp_replace
функции? например
select
col1,
col2,
regexp_replace(XMLAGG(XMLELEMENT(E, colname || ',')).EXTRACT('//text()'),'([^,] )(,1) ', '1') as colname_list
from table
group by col1, col2
Ответ №2:
Вы можете использовать distinct
в подзапросе следующим образом:
select col1, col2, XMLAGG(XMLELEMENT(E, colname || ',')).EXTRACT('//text()')
from (select distinct col1, col2, colname from table)
group by col1, col2
Ответ №3:
Сначала выберите различные значения, затем примените XMLAGG
, например
select col1, col2, XMLAGG(XMLELEMENT(E, colname || ',')).EXTRACT('//text()')
from (select distinct col1, col2, colname
from table
)
group by col1, col2
Хотя, если результирующая строка не превышает 4000 символов, рассмотрите возможность использования LISTAGG
:
select col1, col2, LISTAGG(colname, ',')) within group (order by null)
from (select distinct col1, col2, colname
from table
)
group by col1, col2
Ответ №4:
Хотя DISTINCT
в этом случае работает подзапрос with , это не обобщаемое решение. Это может мешать другим столбцам, которые вы, возможно, захотите включить в запрос.
XMLAGG()
игнорирует NULL
значения. Итак, более общий подход использует ROW_NUMBER()
:
select col1, col2,
XMLAGG(CASE WHEN SEQNUM. = 1 THEN XMLELEMENT(E, colname || ',') END).EXTRACT('//text()')
from (select t.*,
ROW_NUMBER() OVER (PARTITION BY col1, col2, colname ORDER BY colname) as seqnum
from t
) t
group by col1, col2