2016-01-28 4 views

ответ

4

Edit: Как некоторые ребята уже упоминали, Oracle не допускает это регулярное выражение. Поэтому мой подход состоял бы в том, чтобы сделать регулярное выражение для соответствия всем символам, добавить им запятую после символа и затем удалить последнюю запятую.

WITH regex AS (SELECT REGEXP_REPLACE('ABC', '(.)', '\1,') as reg FROM dual) SELECT SUBSTR(reg, 1, length(reg)-1) FROM regex; 

Обратите внимание, что при решении rtrim не может быть ошибки, если строка, которую вы хотите, чтобы разобрать имеет конечное окончание запятой, и вы не хотите, чтобы удалить его.

Предыдущее решение: (Не работает на Oracle)

Проверьте, если это делает трюк:

SELECT REGEXP_REPLACE('ABC', '(.)(?!$)', '\1,') FROM dual; 

Это делает regexp_replace каждого персонажа, но последний за тот же характер, заканчивающуюся на ,

Чтобы увидеть, как regexp_replace работы я рекомендую вам: https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions130.htm

+1

Lookahead и Lookbehind не поддерживаются в Oracle. – Noel

+0

Это решение не сработает. Проверьте выход, он ничего не сделает. –

+0

Я изменил его, так что он работает сейчас. – barbarity

1

Вы могли бы сделать это U петь:

  • REGEXP_REPLACE
  • RTRIM

Например,

SQL> WITH sample_data AS(
    2 SELECT 'ABC' str FROM dual UNION ALL 
    3 SELECT 'DEFG' str FROM dual UNION ALL 
    4 SELECT 'XYZ' str FROM dual 
    5 ) 
    6 -- end of sample_data mimicking a real table 
    7 SELECT str, 
    8 rtrim(regexp_replace(str, '(\w?)', '\1,'),',') new_str 
    9 FROM sample_data; 

STR NEW_STR 
---- ---------- 
ABC A,B,C 
DEFG D,E,F,G 
XYZ X,Y,Z 
+0

Почему нам нужно '(1)?' В шаблоне регулярных выражений? – Noel

+0

@ Ноэль А! правильно, не нужно. Благодарю. –

1

ВЫБРАТЬ RTRIM (REGEXP_REPLACE ('ABC', '().', «\ 1, '),', ') "REGEXP_REPLACE" FROM dual;

Смежные вопросы