Initcap не работает со специальным персонажем - PullRequest
0 голосов
/ 27 сентября 2019

Я делаю

select initcap('the /soap') from dual; 

результат: / Мыло

Но я хочу, чтобы результат был:

/ мыло

Я хочу, чтобы моё мыло было маленьким.Как мне этого добиться?

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

Просто для удовольствия, версия XML, которая в нижнем регистре вводит любое слово (токен), начинающееся с любого знака препинания в строке, которая уже прошла через initcap:

select *
from xmltable(
  'string-join(
    for $t in tokenize($s, " ") 
      return if (matches($t, "^\p{P}")) then lower-case($t) else $t,
    " ")'
  passing initcap('the /soap') as "s"
);

Result Sequence                                                                 
--------------------------------------------------------------------------------
The /soap

И та, которая заменяетinitcap Звоните:

select *
from xmltable(
  'string-join(
    for $t in tokenize($s, " ") 
      return concat(upper-case(substring($t, 1, 1)), lower-case(substring($t, 2))),
    " ")'
  passing 'the /soap' as "s"
);

Result Sequence                                                                 
--------------------------------------------------------------------------------
The /soap
1 голос
/ 27 сентября 2019

Initcap работает таким образом.

Документация говорит:

Слова ограничены пробелами или символами, которые не являются буквенно-цифровыми.

, что означает, что "Мыло "считается отдельным словом (вместо" / soap ", что вам и нужно).

Обходной путь требует небольшого ввода, например:

SQL> with test (col) as
  2    (select 'the /soap' from dual),
  3  t_split as
  4    -- split string to rows
  5    (select regexp_substr(col, '[^ ]+', 1, level) val,
  6            level lvl
  7     from test
  8     connect by level <= regexp_count(col, ' ') + 1
  9    ),
 10  t_initcap as
 11    -- apply INITCAP only to words that don't contain special characters
 12    (select case when not regexp_like(val, '[^0-9A-Za-z]') then initcap(val)
 13                 else val
 14            end valinit,
 15            lvl
 16     from t_split
 17    )
 18    -- merge them back
 19  select listagg(valinit, ' ') within group (order by lvl) result
 20  from t_initcap;

RESULT
--------------------------------------------------------------------------------
The /soap

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