잡동사니

반응형

질문

이 문자열이 있다고 가정합니다.

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

반응형

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band