Question

I have a table containing full body of water names in one column. ie:

  • Golden Lake
  • Blue Water Lake
  • Muskoka River
  • Sandy Bay

I would like to select the water name, but not the type of water [lake, river, ect...]

Individually, I use:

select replace(watername, 'Lake') from water;

But there are 5 different water types that I was hoping to catch in a single select statement.

Was it helpful?

Solution 2

Since you're using 9i, the simplest solution would be to use several REPLACEs:

with v_data as (
  select 'Golden Lake' name from dual union all
  select 'Blue Water Lake' name from dual union all
  select 'Muskoka River' name from dual union all
  select 'Sandy Bay' name from dual 
)  
select replace(
  replace(
    replace(name,
            ' Lake',
            ''),
    ' Bay',
    ''),
   ' River',
   '')
  from v_data

(I've added a space before each sub-pattern to avoid trailing spaces in the result).

Alternatively, you could try loading a Java class for Regular Expressions into the database and using that.

OTHER TIPS

You can use a regex for the replace, using regexp_replace function, for example:

select regexp_replace('Golden Lake, Blue Water Lake, Muskoka River, Sandy B
ay', '( Lake)|( River)|( Bay)', '') from dual

Edit: Since it's 9i, you could try creating a function like this approach.

Or, you may end up doing some weird/ugly select.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top