질문
이 문자열이 있다고 가정합니다.
LOREM IPSUM;DOLOR SIT
공백이 앞에 오는 경우에만 단어의 첫 글자를 대문자로 표시해야 합니다.예를 들어 INITCAP를 사용하면 다음과 같은 결과를 얻습니다.
select initcap('LOREM IPSUM;DOLOR SIT') from dual;
-> Lorem Ipsum;Dolor Sit
대신 다음과 같은 출력이 필요합니다.
Lorem Ipsum;dolor Sit
공백 뒤에만 대문자로 표시하도록 INITCAP를 구성하는 방법이 있습니까? 그렇지 않다면 나에게 몇 가지 아이디어를 줄 수 있습니까?
감사합니다
답변1
각 문자열 (공백으로 구분)을 분리하고 다음과 같이 작업해야합니다.
SQL> select T.STR,
2 LISTAGG(
3 UPPER(SUBSTR(REGEXP_SUBSTR(T.STR,'[^ ]+',1, LEVELS.COLUMN_VALUE),1,1))
4 || LOWER(SUBSTR(REGEXP_SUBSTR(T.STR,'[^ ]+',1, LEVELS.COLUMN_VALUE),2)),' ')
5 WITHIN GROUP (ORDER BY LEVELS.COLUMN_VALUE) AS RESULT
6 FROM
7 (SELECT 'LOREM IPSUM;DOLOR SIT' AS STR from dual
8 union all
9 SELECT 'TEJASH HINGU SO,ANSWER WEIZEN;QUESTION' AS STR from dual) t -- YOUR DATA
10 cross join table(cast(multiset(select level from dual
11 connect by level <= length (regexp_replace(T.str, '[^ ]+')) + 1)
12 as sys.OdciNumberList)) levels
13 GROUP BY T.STR;
STR RESULT
-------------------------------------- ----------------------------------------
LOREM IPSUM;DOLOR SIT Lorem Ipsum;dolor Sit
TEJASH HINGU SO,ANSWER WEIZEN;QUESTION Tejash Hingu So,answer Weizen;question
SQL>
답변2
두 개 이상의 공간이 함께 있을 수 있고 잃어버려서는 안되는 경우
-- Oracle 12+
with s as
(select 'LOREM IPSUM;DOLOR SIT DOLOR SIT' str from dual union all
select 'TEJASH HINGU SO,ANSWER WEIZEN;QUESTION' from dual
)
select s.str,
listagg(
regexp_substr(s_str, '^\s+') ||
upper(regexp_substr(s_str, '\S')) ||
lower(regexp_substr(s_str, '\S(\S+)', 1, 1, 'i', 1))
)
within group (order by rn) ls
from s,
lateral
(select rownum rn, regexp_substr(s.str, '(^|\s+)\S*', 1, level) s_str
from dual
connect by level <= regexp_count(s.str, '^|\s+')
) l
group by s.str;
STR LS
----------------------------------------- ------------------------------------------
LOREM IPSUM;DOLOR SIT DOLOR SIT Lorem Ipsum;dolor Sit Dolor Sit
TEJASH HINGU SO,ANSWER WEIZEN;QUESTION Tejash Hingu So,answer Weizen;question
답변3
방법은 다음과 같습니다.
with data
as (select 'LOREM IPSUM;DOLOR SIT' as str
from dual
)
,split_data
as(
SELECT lower(trim(regexp_substr(str, '[^ ]+', 1, LEVEL))) split_str
,upper(substr(lower(trim(regexp_substr(str, '[^ ]+', 1, LEVEL))),1,1))
||substr(lower(trim(regexp_substr(str, '[^ ]+', 1, LEVEL)))
,2,length(str)
) as capital_word
FROM data
CONNECT BY instr(str, ' ', 1, LEVEL - 1) > 0
)
select listagg(capital_word,' ')
from split_data
https://dbfiddle.uk/?rdbms=oracle_18&fiddle=6e3dc670ee678d5622de3ef51c7c480c
출처 : https://stackoverflow.com/questions/62692003/capitalize-only-after-whitespace-oracle-sql