sql >> Database >  >> RDS >> Oracle

SQL om woorden in hoofdletters uit een kolom te vinden

Dit zou een manier kunnen zijn:

-- 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

Het idee is om elke tekenreeks te tokeniseren, vervolgens de woorden die niet door hoofdletters zijn gemaakt af te knippen en vervolgens de resterende woorden samen te voegen.

Het resultaat:

1    EXAMPLE
2    TEST
3    VALUE
4    IS EXAMPLE

Als u een ander teken als hoofdletter moet gebruiken, kunt u de where . bewerken voorwaarde om te filteren op de overeenkomende woorden; bijvoorbeeld met '_':

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

geeft:

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


  1. Hoe PostgreSQL 9.0-extensies niet te bouwen op RPM-platforms

  2. Kolom met hogere kardinaliteit eerst in een index bij een bereik?

  3. Meer over de introductie van tijdzones in langlevende projecten

  4. Waarom is 1899-12-30 de nuldatum in Access / SQL Server in plaats van 31-12?