Oracle SQL-запрос. Как получить строковые токены из строки, используя пробел в качестве разделителя, а затем отобразить селективные токены? - PullRequest
0 голосов
/ 12 сентября 2018

Например, у меня есть таблица - USERS, с колонкой NAME1 varchar2 (30).В настоящее время в нем находятся следующие записи:

NAME1:
Benjamin Barker
Alexis Jacob Alexander Cruise
Christopher James Lee

Как создать функцию или написать запрос, в котором я могу получить вывод следующим образом:

Benjamin ****
Alexis **** Cruise
Christopher **** Lee 

Функция / запрос вычислитНазовите строку и верните Eg 'Benjamin barker' как 2 токена, но отобразите только первый токен.Если имя имеет три или более токенов, например, 'Christopher James Lee' или 'Alexis Jacob Alexander Cruise', оно будет отображать только первый и последний токен.

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

Самый простой способ - использовать regexp_replace:

regexp_replace(<text>,'\s+((\S+$)|(.*(\s+\S+$)))',' xxxx\4')

. Я не хочу вдаваться в подробности, как это работает, но вы можете прочитать любое руководство о regular expressions, чтобы узнать больше.

0 голосов
/ 13 августа 2019
create or replace function get_token 
  (in_str varchar2, in_token varchar2, in_separator varchar2 default ' ') return varchar2
as
begin
  return regexp_substr (in_str, '[^' || in_separator || ']+', 1, in_token);
end;  
/

select get_token('Christopher James Lee',1) || '****' 
         || get_token('Christopher James Lee',3) from dual;
0 голосов
/ 12 сентября 2018

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

-- CTE for your sample data
with users (name1) as (
            select 'Benjamin Barker' from dual
  union all select 'Alexis Jacob Alexander Cruise' from dual
  union all select 'Christopher James Lee' from dual
  union all select 'Madonna' from dual
)
-- actual query
select case
         when instr(name1, ' ') = 0
         then name1
         else substr(name1, 1, instr(name1, ' ') - 1)
       end
    || case
         when instr(name1, ' ', 1, 2) > 0
         then substr(name1, instr(name1, ' ', -1))
       end
    as result
from users;

RESULT                                                    
----------------------------------------------------------
Benjamin
Alexis Cruise
Christopher Lee
Madonna

Если вы действительно хотите ****, как показано в вопросе, вы можете объединить его в первом предложении else:

select case
         when instr(name1, ' ') = 0
         then name1
         else substr(name1, 1, instr(name1, ' ') - 1) || ' ****'
       end
    || case
         when instr(name1, ' ', 1, 2) > 0
         then substr(name1, instr(name1, ' ', -1))
       end
    as result
from users;

RESULT                                                         
---------------------------------------------------------------
Benjamin ****
Alexis **** Cruise
Christopher **** Lee
Madonna

или, если вы хотите добавить + Masked, как вы сказали в комментарии, только к тем, которые действительно изменены, вы можете просто объединить третье выражение:

select case
         when instr(name1, ' ') = 0
         then name1
         else substr(name1, 1, instr(name1, ' ') - 1)
       end
    || case
         when instr(name1, ' ', 1, 2) > 0
         then substr(name1, instr(name1, ' ', -1))
       end
    || case
         when instr(name1, ' ', 1, 1) > 0
         then ' + Masked'
       end
    as result
from users;

RESULT                                                             
-------------------------------------------------------------------
Benjamin + Masked
Alexis Cruise + Masked
Christopher Lee + Masked
Madonna

Если вы хотите использовать это в функции, просто используйте те же выражения:

create or replace function short_name (p_name varchar2)
return varchar2 as
begin
  return case
           when instr(p_name, ' ') = 0
           then p_name
           else substr(p_name, 1, instr(p_name, ' ') - 1)
         end
      || case
           when instr(p_name, ' ', 1, 2) > 0
           then substr(p_name, instr(p_name, ' ', -1))
         end
      || case
           when instr(p_name, ' ', 1, 1) > 0
           then ' + Masked'
         end;
end short_name;
/

select short_name(name1) as result from users;

RESULT                        
------------------------------
Benjamin + Masked
Alexis Cruise + Masked
Christopher Lee + Masked
Madonna
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...