у меня есть строка 'Tprintthisstring' и я хочу вывести в 'T, pri, ntt, his, str, ing'. может кто-нибудь помочь мне в этом - PullRequest
0 голосов
/ 03 октября 2019

Я хочу напечатать в Oracle.

Input string : 'Tprintthisstring' 

Output string: 'T,pri,ntt,his,str,ing' 

Ответы [ 3 ]

1 голос
/ 03 октября 2019

Используйте регулярное выражение для добавления запятой перед каждым блоком из 3 строчных букв.

Запрос :

SELECT REGEXP_REPLACE( 'Tprintthisstring', '([a-z]{3})', ',\1' )
FROM   DUAL;

Вывод :

| REGEXP_REPLACE('TPRINTTHISSTRING','([A-Z]{3})',',\1') |
| :---------------------------------------------------- |
| T,pri,ntt,his,str,ing                                 |

дБ <> скрипка здесь

0 голосов
/ 04 октября 2019

включить выход сервера;ОБЪЯВИТЬ 1 VARCHAR2 (256);l1 VARCHAR2 (256);ЛЕН НОМЕР;str1 VARCHAR (20);str2 VARCHAR (20);НОМЕР (10);счетчик НОМЕР (10);я НОМЕР (10);p_string VARCHAR2 (1000): = 'aaasasdasd, rrt';decml NUMBER (10): = 3;НАЧАТЬ: = 1;

i := 1; 

l := Substr (p_string, Instr (p_string, ',') + 1); 

l1 := Substr (p_string, 0, Instr (p_string, ',') - 1); 

len := Length (l1); 

IF len <= decml THEN 
  str1 := l1 
          ||',' 
          ||l; 
ELSE 
  counter := Floor (len / decml); 

  FOR a IN REVERSE i .. counter LOOP 
      str1 := str1 
              || '.' 
              || Substr (l1, -decml * a, decml); 
  END LOOP; 

  IF ( counter * decml = len ) THEN 
    str1 := Substr (str1, 2, Length (str1)) 
            || ',' 
            || l; 
  ELSE 
    str2 := Substr (l1, 1, ( len - ( counter * decml ) )); 

    str1 := str2 
            || str1 
            || ',' 
            || l; 
  END IF; 
END IF; 

dbms_output.Put_line(str1); 

END;

0 голосов
/ 03 октября 2019

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

SQL> with test (col) as
  2    (select 'Tprintthisstring' from dual
  3    ),
  4  temp as
  5    -- c1 is the first letter
  6    -- then split the rest into groups of 3 letters (rows)
  7    (select substr(substr(col, 2), 3 * (level - 1) + 1, 3) c2,
  8            level lvl,
  9            substr(col, 1, 1) c1
 10     from test
 11     connect by level <= length(substr(col, 2))
 12    )
 13  -- aggregate the c2 string back, separated by comma
 14  select c1 ||','||
 15        listagg(c2, ',') within group (order by lvl) result
 16  from temp
 17  where c2 is not null
 18  group by c1;

RESULT
-------------------------------------------------------------------------------
T,pri,ntt,his,str,ing

SQL>

Я не уверен, почему вы пометили его как PL / SQL и какой это должен быть PL / SQL;анонимный блок? Хранимая процедура? Как бы то ни было, приведенный выше запрос можно легко преобразовать в PL / SQL.

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