Oracle PL / SQL - удалить последний экземпляр определенного символа - PullRequest
4 голосов
/ 06 апреля 2011

enter code here Я работаю над созданием группы функций, которые возвращают строку json на основе параметров и внутреннего выбора.

Проблема, с которой я сталкиваюсь, заключается в том, что я зацикливаюсь на курсоре в pl / sql, выстраивая структуру json, она добавляет дополнительную запятую в конце последнего узла.

Он анализируется правильно, но HTML-оценка json не выполняется из-за этой лишней запятой. Можно ли удалить конкретный символ (скажем, последнюю запятую в строке) в pl / sql. Я посмотрел на REPLACE, но я не могу найти документацию по использованию REPLACE с конкретными экземплярами символа.

Цикл выглядит так:

FOR appGroup IN appGroups
LOOP

tsResults := tsResults || ' "Group" : { ';
tsResults := tsResults || ' "Id" : "' || appGroup.group_id || '", ';
tsResults := tsResults || '"Name" : "' || appGroupd.display_name || '" ';
tsResults := tsResults || ' }, ';

END LOOP;

Это самая последняя запятая в последнем ряду, которая вызывает у меня горе.

Есть ли способ убить последнего без захвата всех строковых символов перед ним и всех символов после него и их объединения?

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

Обновление

Используя ответ Cybernate, я смог внести некоторые изменения, чтобы заставить его работать ... Первоначально сразу после END LOOP; У меня был дополнительный код, добавляющий больше к строке результата:

tsResults := tsResults ||  '}] }';

Что правильно завершило массив групп, над которым я работал ...

Я поместил следующий код перед этой строкой:

tiLastComma := INSTR(tsResults, ',', -1);
tsResults := SUBSTR(tsResults, 1, tiLastComma - 1);

Теперь json завершается корректно и корректно исчезает при использовании с jquery.

Ответы [ 3 ]

6 голосов
/ 06 апреля 2011

Вы можете использовать функцию INSTR, чтобы найти позицию последнего вхождения символа ",", а затем использовать SUBSTRING.

 SELECT SUBSTR(tsResults , 1, INSTR(tsResults , ',', -1)-1)
    INTO tsResults 
    FROM dual;

Если вы не думаете, что регулярное выражение является излишним для этого, используйтеэто утверждение в вашем PL / SQL:

 SELECT REGEXP_REPLACE(tsResults , '\s*,\s*$', '') 
    INTO tsResults 
    FROM dual;
4 голосов
/ 08 апреля 2013

Функцию rtrim проще использовать.Итак, после цикла:

tsResults := rtrim( tsResults, ',' );

Затем, чтобы завершить JSON, добавьте закрывающую фигурную скобку в том же выражении:

tsResults := rtrim( tsResults, ',' ) || '}';
0 голосов
/ 26 ноября 2013

Тоби, у меня был похожий сценарий, но помните, что с RTRIM он удалит все экземпляры значения, которое вы прописали в функции.

Например:

Я хотел бы обрезать«X» от конца выбора столбца.(ТОЛЬКО ПОСЛЕДНЯЯ ИНСТАНЦИЯ)

Значение столбца = 'SOMEVALUEXX'

Теперь RTrim вернет: 'SOMEVALUE'

Возможно, вы после = 'SOMEVALUEX'

Ответ Чанду правильный.

Всегда проверяйте свой бизнес-процесс.

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