首页 > 解决方案 > initcap 仅适用于超过三个字符的单词

问题描述

我正在尝试创建一个将 initcap 应用于字段的选择语句,但我只想将超过三个字符的单词设为大写。

请注意,我无法创建外部函数,我的问题并没有被这个答案解决: Initcap skip words小于4 characters

因为他们解决了使用手动检查匹配项的程序。

所以我想用一些东西:

SELECT REGEXP_REPLACE(initcap(myField),"\w{1,10}\b") FROM dual

MyField 包含类似 GUNS N ROSES 的内容,我想转变成 Guns n Roses

标签: sqlregexoracle

解决方案


您需要为它执行单独的逻辑。

它需要将语句分解为单个单词并执行initcapiflength超过 3 个字符。之后使用aggregate function.

WITH DATAA AS
(SELECT 'GUNS N ROSES' AS STR FROM DUAL)

SELECT LISTAGG(CASE WHEN LENGTH(STRR) > 3       
                    THEN INITCAP(STRR) 
                    ELSE STRR 
               END, ' ')
       WITHIN GROUP (ORDER BY LVL) AS RESULT
FROM
  (SELECT LEVEL AS LVL, 
          LOWER(REGEXP_SUBSTR(STR, '[^ ]+', 1, LEVEL)) AS STRR
     FROM DATAA
   CONNECT BY LEVEL <= REGEXP_COUNT(STR, ' ') + 1);

db<>小提琴演示

干杯!!


推荐阅读