SQL для поиска слов верхнего регистра из столбца

У меня есть столбец описания в моей таблице, и его значения:

This is a EXAMPLE
This is a TEST
This is a VALUE

Я хочу отобразить только EXAMPLE, TEST и VALUE из столбца описания.

Как мне это достичь?

Ответ 1

Это может быть способ:

-- a test case
with test(id, str) as (
select 1, 'This is a EXAMPLE' from dual union all
select 2, 'This is a TEST' from dual union all
select 3, 'This is a VALUE' from dual union all
select 4, 'This IS aN EXAMPLE' from dual
)
-- concatenate the resulting words
select id, listagg(str, ' ') within group (order by pos)
from (
    -- tokenize the strings by using the space as a word separator
    SELECT id,
           trim(regexp_substr(str, '[^ ]+', 1, level)) str,
           level as pos           
      FROM test t
    CONNECT BY instr(str, ' ', 1, level - 1) > 0
      and prior id = id
      and prior sys_guid() is not null
    )
-- only get the uppercase words
where regexp_like(str, '^[A-Z]+$')   
group by id

Идея состоит в том, чтобы обозначить каждую строку, а затем отрезать слова, которые не были сделаны символами верхнего регистра, а затем объединить оставшиеся слова.

Результат:

1    EXAMPLE
2    TEST
3    VALUE
4    IS EXAMPLE

Если вам нужно обработать какой-либо другой символ в виде буквы в верхнем регистре, вы можете отредактировать, where условие для фильтрации соответствующих слов; например, с помощью "_":

with test(id, str) as (
select 1, 'This is a EXAMPLE' from dual union all
select 2, 'This is a TEST' from dual union all
select 3, 'This is a VALUE' from dual union all
select 4, 'This IS aN EXAMPLE' from dual union all
select 5, 'This IS AN_EXAMPLE' from dual
)
select id, listagg(str, ' ') within group (order by pos)
from (
    SELECT id,
           trim(regexp_substr(str, '[^ ]+', 1, level)) str,
           level as pos           
      FROM test t
    CONNECT BY instr(str, ' ', 1, level - 1) > 0
      and prior id = id
      and prior sys_guid() is not null
    )
where regexp_like(str, '^[A-Z_]+$')   
group by id

дает:

1   EXAMPLE
2   TEST
3   VALUE
4   IS EXAMPLE
5   IS AN_EXAMPLE

Ответ 2

Этого можно добиться благодаря функции REGEXP_REPLACE:

SELECT REGEXP_REPLACE(my_column, '(^[A-Z]| |[a-z][A-Z]*|[A-Z]*[a-z])', '') AS Result FROM my_table

Он использует регулярное выражение, которое заменяет первый верхний регистр символа строки и преобразует каждый символ нижнего регистра и пробел с пробелами.

Ответ 3

Вот еще одно решение. Это было вызвано ответом Алексея.

Идея? Получите все слова. Затем агрегат будет полностью заполнен только списком.

Пример данных:

 create table descriptions (ID int, Description varchar2(100));

 insert into descriptions (ID, Description) 
 select 1 as ID, 'foo Foo FOO bar Bar BAR' as Description from dual 
 union all select 2, 'This is an EXAMPLE TEST Description VALUE' from dual
 ;

Запрос:

 select id, Description, listagg(word, ',') within group (order by pos) as UpperCaseWords
 from (
     select 
      id, Description,
      trim(regexp_substr(Description, '\w+', 1, level)) as word,
      level as pos           
     from descriptions t
     connect by regexp_instr(Description, '\s+', 1, level - 1) > 0
       and prior id = id
       and prior sys_guid() is not null
     )
 where word = upper(word)
 group by id, Description

Результат:

ID | DESCRIPTION                               | UPPERCASEWORDS    
-- | ----------------------------------------- | ------------------
 1 | foo Foo FOO bar Bar BAR                   | FOO,BAR           
 2 | This is an EXAMPLE TEST Description VALUE | EXAMPLE,TEST,VALUE

Ответ 4

Попробуй это:

SELECT SUBSTR(column_name, INSTR(column_name,' ',-1) + 1)
FROM your_table;

Ответ 5

Это должно сделать трюк:

SELECT SUBSTR(REGEXP_REPLACE(' ' || REGEXP_REPLACE(description, '(^[A-Z]|[a-z]|[A-Z][a-z]+|[,])', ''), ' +', ' '), 2, 9999) AS only_upper
FROM ( 
    select 'Hey IF you do not know IT, This IS a test of UPPERCASE and IT, with good WILL and faith, Should BE fine to be SHOWN' description
    from dual 
)

Я добавил условие для запятых запятыми, вы можете добавить внутрь, чтобы сменить другие специальные символы для удаления.

ONLY_UPPER
-----------------------------------
IF IT IS UPPERCASE IT WILL BE SHOWN

Ответ 6

Это функция, основанная на некоторых ответах регулярного выражения.

create or replace function capwords(orig_string varchar2)
return varchar2
as
out_string varchar2(80);
begin
  out_string := REGEXP_REPLACE(orig_string, '([a-z][A-Z_]*|[A-Z_]*[a-z])', '');
  out_string := REGEXP_REPLACE(trim(out_string), '(  *)', ' ');
  return out_string;
end;
/

Удаляет строки букв верхнего регистра и подчеркивания, которые имеют строчные буквы на обоих концах. Заменяет несколько соседних пространств одним пробелом. Убирает лишние пробелы с концов. Предполагает максимальный размер 80 символов.

Немного отредактированный вывод:

>select id,str,capwords(str) from test;

        ID STR                            CAPWORDS(STR)
---------- ------------------------------ ------------------
         1 This is a EXAMPLE              EXAMPLE
         2 This is a TEST                 TEST
         3 This is a VALUE                VALUE
         4 This IS aN EXAMPLE             IS EXAMPLE
         5 This is WITH_UNDERSCORE        WITH_UNDERSCORE
         6 ThiS IS aN EXAMPLE             IS EXAMPLE
         7 thiS IS aN EXAMPLE             IS EXAMPLE
         8 This IS wiTH_UNDERSCORE        IS

Ответ 7

Если вам нужно всего лишь "отобразить" результат без изменения значений в столбце, вы можете использовать CASE WHEN (в примере Description - это имя столбца):

Select CASE WHEN Description like '%EXAMPLE%' then 'EXAMPLE' WHEN Description like '%TEST%' then 'TEST' WHEN Description like '%VALUE%' then 'VALUE' END From [yourTable]

Условия не чувствительны к регистру, даже если вы пишете все в верхнем регистре. Вы можете добавить Else '<Value if all conditions are wrong>' до END если есть описания, которые не содержат никаких значений. Пример вернет NULL для этих случаев, и запись ELSE Description вернет исходное значение этой строки.

Он также работает, если вам нужно обновить. Это простой и практичный, легкий выход, ха-ха.