2016-07-28 9 views
1

Я loooking для регулярных выражений выражения или что-то из этого:Split прописными Oracle

------------------------ 
| id | prop_name | 
------------------------ 
| 1 | isThisAnExample | 
------------------------ 

Для этого:

----------------------------- 
| id | prop_name   | 
----------------------------- 
| 1 | Is This An Example | 
----------------------------- 

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

+0

Вы будете найди свой ответ здесь. http://stackoverflow.com/questions/23470794/split-words-with-a-capital-letter-in-sql –

+2

@Marc Это не Oracle. – Rene

ответ

1

Может быть, это регулярное выражение вы ищете

«Вставить пробел между каждым строчной символ, за которым следует верхний регистр символа»:

select regexp_replace('IsThisAnExample', '([[:lower:]])([[:upper:]])', '\1 \2') from dual 

Первый символ может просто заменить на верхний регистр письмо

select upper(substr('isThisAn Example', 1,1))||substr('isThisAn Example', 2) from dual; 

Итак, первый заменить первый символ и regexp_replace результата:

select regexp_replace(upper(substr('isThisAn Example', 1,1))||substr('isThisAn Example', 2), '([[:lower:]])([[:upper:]])', '\1 \2') from dual; 

Если только первый символ вашего предложения должна быть прописной буквы, а затем попробовать:

select upper(substr(regexp_replace('IsThisAnExample', '([[:lower:]])([[:upper:]])', '\1 \2'),1,1))|| 
     lower(substr(regexp_replace('IsThisAnExample', '([[:lower:]])([[:upper:]])', '\1 \2'),2)) 
from dual 
+0

Отлично. Теперь, если вы можете расширить свое решение так: «Вставьте пробел между каждым строчным символом, за которым следует символ верхнего регистра, и сделайте эти символы нижнего регистра верхним, а также первым символом строки» будет все, что я ищу –

+2

Это сделано , см. мои настройки :-) –

+0

Да, у нас теперь есть верхний первый символ, который велик! 'isThisAnExample' -> «Это пример». Теперь последний запрос - «Это пример» -> «Это пример». –

0

Лучше использовать регулярное выражение, но в любом случае:

SELECT listagg(splitted, '') within GROUP (ORDER BY lvl) FROM( 
    SELECT LEVEL lvl, CASE WHEN SUBSTR(your_string, LEVEL, 1) = 
        UPPER(SUBSTR(your_string, LEVEL, 1)) 
     THEN ' ' || SUBSTR(your_string, LEVEL, 1) ELSE 
        SUBSTR(your_string, LEVEL, 1) END splitted 
FROM (SELECT 'isThisAnExample' your_string FROM dual) 
CONNECT BY LEVEL <= LENGTH(your_string)); 
0

Аналогично решению Франка, но более простое (сокращение как можно большего числа регулярных выражений):

with 
    input (str) as (
     select 'isThisAnExample' from dual 
    ) 
select upper(substr(str, 1, 1)) || 
     lower(regexp_replace(substr(str, 2), '(^|[[:lower:]])([[:upper:]])', '\1 \2')) 
      as modified_str 
from input; 

MODIFIED_STR 
------------------ 
Is this an example 

1 row selected. 
+0

Да работает отлично. Отличная работа :) –