Oracle SQL - создать строку путем объединения строк, но не превышает X символов - PullRequest
0 голосов
/ 09 июля 2019

Сначала я пытаюсь объединить строки в строку, разделенную запятой.Во-вторых, я не хочу, чтобы длина строки превышала X символов.Если будет превышать, то создайте еще одну строку из следующей строки, не разрезая символ из каждой строки.Я пытаюсь добиться этого с помощью оракула SQL.

Я смотрю на LISTAGG, который дает мне объединенную строку, но я не представляю, как можно разделить на X количество символов без разделения значений из каждой строки, давайтескажи мой Х = 15 символов.То, что я получаю, используя приведенный ниже код:

1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20

select listagg(x, ',') within group(order by x)
from (select level x from dual
      connect by level <= 20
      )
;

Мой ожидаемый результат будет,

строка 1: 1,2,3,4,5,6,7,8 (15 символов)

строка 2: 9,10,11,12,13 (13 символов, поскольку это значение превысит 15, если я добавлю значение из следующей строки)

строка 3: 14,15,16,17,18 (14 символов)

строка 4: 19,20 (5 символов)

Я все еще не уверен, что это может быть достигнуто, любые предложения или подсказки будут наиболее оценены.

1 Ответ

6 голосов
/ 09 июля 2019

Я попробовал следующий запрос и добился желаемого результата.

SELECT
    LISTAGG(X, ',') WITHIN GROUP(
        ORDER BY
            X
    ) as result
FROM
    (
        SELECT
            X,
            SUM(LENGTH(X)) OVER(
            ORDER BY
                X
            ) LENGTH_X,
            COUNT(1) OVER(
            ORDER BY
                X
            ) - 1 AS COMMAS
        FROM
            (
                SELECT
                    LEVEL   X
                FROM
                    DUAL
                CONNECT BY
                    LEVEL <= 20
            )
    )
GROUP BY
    CEIL((LENGTH_X + COMMAS) / 15);

Выход:

Output

db <> демо fiddle

Ура !!

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