【问题标题】:Need help for extracting substring from string till last space before certain length需要帮助从字符串中提取子字符串直到特定长度之前的最后一个空格
【发布时间】:2019-08-16 15:05:00
【问题描述】:

我正在尝试将子字符串设置为特定长度。例如字符串长度为 100。我需要将字符串剪切为 31 个字符,但不需要剪切整个单词。

PARTNER ESSENTIAL 24 MONTHS INITIAL FOR NETBACKUP SELF SERVICE XPLAT

如果我只是简单地拆分后 31 个字符,结果是第一部分是 PARTNER ESSENTIAL 24 MONTHS INI,第二部分是 TIAL FOR NETBACKUP SELF SERV,并带有单词 INITIAL 拆分。我需要以... 24 MONTHS 结尾,并将整个单词INITIAL 放入第二部分。

所以我需要将字符串分隔到最后一个空格以使其清晰易懂。还有一件事需要在一个查询中执行。

【问题讨论】:

  • 第一部分和第二部分是什么意思 - 结果集的同一行中的两列?还是分成两行?第二部分可以多长,最多 69 个字符(总共 100 个)还是需要进一步拆分?

标签: sql oracle substring


【解决方案1】:

您可以使用 REGEXP_REPLACE。使用尽可能多的字符(最多 31 个),后跟空格或字符串结尾。

SELECT REGEXP_REPLACE(
  'PARTNER ESSENTIAL 24 MONTHS INITIAL FOR NETBACKUP SELF SERVICE XPLAT',
  '(.{1,31})( |$)(.*)',
  '\1' )
FROM dual;

合作伙伴必备 24 个月

使用'\3'代替获取其余部分:

NETBACKUP 自助服务 XPLAT 的初始设置

【讨论】:

  • .. 并且为了 OP 的利益,如果模式的结尾也在括号中,即(.{1,31})( |$).(.*),那么可以使用\3 检索值的后半部分。
  • 是的,这行得通!谢谢,现在如何将第二部分放入同一行的另一列。
  • 正如 Alex Poole 所说,您可以执行另一个 REGEXP_REPLACE,在 .* 周围加上括号并使用 \3 而不是 \1
  • 我已经尝试过这个REGEXP_REPLACE(MyString, '(.{1,32})( |$).*', '\3' ) 并且喜欢返回我根本没有任何价值。我是不是弄错了。再次感谢。
  • 我编辑了我的答案以添加您错过的括号。
【解决方案2】:

您可以使用instrsubstr 来识别相关的空间位置,并使用大小写表达式,因此您只尝试拆分较长的值:

-- CTE for sample data
with your_table (str) as (
  select 'PARTNER ESSENTIAL 24 MONTHS INITIAL FOR NETBACKUP SELF SERVICE XPLAT' from dual
  union all
  select 'PARTNER ESSENTIAL 24 MONTHS INI' from dual
  union all
  select 'PARTNER ESSENTIAL 24 MONTHS' from dual
  union all
  select 'PARTNER ESSENTIAL 24' from dual
)
-- actual query
select str,
  length(str) as str_len,
  case when length(str) <= 31 then str
       else substr(str, 1, instr(str, ' ', 31 - length(str), 1))
  end as part_1,
  case when length(str) <= 31 then null
       else substr(str, instr(str, ' ', 31 - length(str), 1) + 1)
  end as part_2
from your_table;

STR                                                                     STR_LEN PART_1                          PART_2                                                               
-------------------------------------------------------------------- ---------- ------------------------------- ---------------------------------------------------------------------
PARTNER ESSENTIAL 24 MONTHS INITIAL FOR NETBACKUP SELF SERVICE XPLAT         68 PARTNER ESSENTIAL 24 MONTHS     INITIAL FOR NETBACKUP SELF SERVICE XPLAT                             
PARTNER ESSENTIAL 24 MONTHS INI                                              31 PARTNER ESSENTIAL 24 MONTHS INI                                                                      
PARTNER ESSENTIAL 24 MONTHS                                                  27 PARTNER ESSENTIAL 24 MONTHS                                                                          
PARTNER ESSENTIAL 24                                                         20 PARTNER ESSENTIAL 24                                                                                 

【讨论】:

    【解决方案3】:

    不像已经发布的regexp_replace 变体那样优雅,而是另一种方法,使用substrinstr,逐步进行。我尝试自己对代码进行注释,如果有任何问题,请告诉我。 HTH KR 彼得

    with 
     your_input as 
        (select 'PARTNER ESSENTIAL 24 MONTHS INITIAL FOR NETBACKUP SELF SERVICE XPLAT' string_ from dual)
    ,first_31_chars as
        (select substr(your_input.string_,1,31) substring_ from your_input)
    ,last_space_in_first_31_chars as
        (select instr(first_31_chars.substring_,' ',-1,1) position_ from first_31_chars)
    ,first_part as 
        (select trim(substr(string_,1,position_)) fp_substring_ from your_input,last_space_in_first_31_chars)
    ,second_part as 
        (select trim(substr(string_,position_)) sp_substring_ from your_input,last_space_in_first_31_chars)
    select fp_substring_,sp_substring_ from first_part,second_part;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-04
      • 1970-01-01
      • 1970-01-01
      • 2022-08-10
      • 2021-10-30
      • 2022-11-10
      相关资源
      最近更新 更多