Нужна помощь для извлечения подстроки из строки до последнего пробела до определенной длины - PullRequest
2 голосов
/ 26 марта 2019

Я пытаюсь подстроки до определенной длины. Например, длина строки равна 100. Мне нужно вырезать строку из 31 символа, но не вырезать целые слова.

PARTNER ESSENTIAL 24 MONTHS INITIAL FOR NETBACKUP SELF SERVICE XPLAT

Если я просто разделю корму на 31 символ, то получается, что первая часть - PARTNER ESSENTIAL 24 MONTHS INI, а вторая - TIAL FOR NETBACKUP SELF SERV со словом INITIAL split. Мне нужно закончить на ... 24 MONTHS и поместить слово INITIAL во вторую часть.

Так что мне нужно отделить строку до последнего пробела, чтобы сделать это ясным и понятным. Еще одна вещь, которую нужно выполнить в одном запросе.

Ответы [ 3 ]

2 голосов
/ 26 марта 2019

Вы можете использовать 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

1 голос
/ 26 марта 2019

не такой элегантный, как уже опубликованный вариант regexp_replace, но другой способ сделать это, используя substr и instr, в пошаговом подходе.Я попытался сделать комментарий к самому коду, дайте мне знать, если есть какие-либо вопросы.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;
1 голос
/ 26 марта 2019

Вы можете использовать instr и substr для определения соответствующей позиции пробела, с выражением регистра, поэтому вы пытаетесь только разделить более длинные значения:

-- 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                                                                                 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...