У меня есть столбец описания в моей таблице, и его значения:
This is a EXAMPLE
This is a TEST
This is a VALUE
Я хочу отобразить только EXAMPLE, TEST и VALUE из столбца описания.
Как мне это достичь?
У меня есть столбец описания в моей таблице, и его значения:
This is a EXAMPLE
This is a TEST
This is a VALUE
Я хочу отобразить только EXAMPLE, TEST и VALUE из столбца описания.
Как мне это достичь?
Это может быть способ:
-- 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
Этого можно добиться благодаря функции REGEXP_REPLACE:
SELECT REGEXP_REPLACE(my_column, '(^[A-Z]| |[a-z][A-Z]*|[A-Z]*[a-z])', '') AS Result FROM my_table
Он использует регулярное выражение, которое заменяет первый верхний регистр символа строки и преобразует каждый символ нижнего регистра и пробел с пробелами.
Вот еще одно решение. Это было вызвано ответом Алексея.
Идея? Получите все слова. Затем агрегат будет полностью заполнен только списком.
Пример данных:
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
Попробуй это:
SELECT SUBSTR(column_name, INSTR(column_name,' ',-1) + 1)
FROM your_table;
Это должно сделать трюк:
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
Это функция, основанная на некоторых ответах регулярного выражения.
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
Если вам нужно всего лишь "отобразить" результат без изменения значений в столбце, вы можете использовать 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
вернет исходное значение этой строки.
Он также работает, если вам нужно обновить. Это простой и практичный, легкий выход, ха-ха.