Как получить разные значения, используя LISTAGG и Regexp_replace - PullRequest
0 голосов
/ 25 августа 2018

Вот мой запрос:

SELECT LISTAGG(product_name, chr(10)) WITHIN GROUP (ORDER BY product_name) "Product_Listing"
FROM products;

Вывод запроса:

apple
orange
apple
mango
orange
banana
banana
apple

Требуемый вывод:

apple
orange
mango
banana

Как использовать regexp_replace дляэтот?Любые другие функции / идеи.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

Если вы ищете только одну строку с разными продуктами, то метод Лукаша работает нормально.

Если вы действительно хотите какие-либо другие столбцы сводки, то, вероятно, они не будут делать то, что вы хотите. Вы можете использовать это вместо:

SELECT LISTAGG(CASE WHEN seqnum = 1 THEN product_name END, chr(10))
           WITHIN GROUP (ORDER BY product_name) as Product_Listing
FROM (SELECT p.*,
             ROW_NUMBER() OVER (PARTITION BY product_name ORDER BY product_name) as seqnum
      FROM products p
     ) p;

Я не советую удалять дубликаты после LISTAGG(), хотя бы потому, что Oracle накладывает довольно короткий предел на результат. Но вы можете сделать это как:

SELECT REGEXP_REPLACE(LISTAGG(product_name END, chr(10)) WITHIN GROUP (ORDER BY product_name),
                      '([^\x10]+)(\x10\1)+',
                      '\1'
                     ) as Product_Listing
FROM products p;

Удаляет соседние дубликаты. Из-за ORDER BY дубликаты находятся рядом. Так что должно работать.

0 голосов
/ 25 августа 2018

Это возможно без REGEXP_REPLACE, например, используя DISTINCT:

SELECT LISTAGG(product_name, chr(10)) WITHIN GROUP (ORDER BY product_name) 
       "Product_Listing" 
FROM (SELECT DISTINCT product_name FROM products) s;

Демоверсия DBFiddle

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