如何在单个语句中替换/删除字符串中的多个单词

use*_*196 4 sql oracle oracle9i

我在一列中有一个包含完整水体名称的表格.即:

  • 金湖
  • 蓝水湖
  • 马斯科卡河
  • 桑迪湾

我想选择水的名称,但不是水的类型[湖泊,河流等...]

我个人使用:

select replace(watername, 'Lake') from water;
Run Code Online (Sandbox Code Playgroud)

但是,我希望在一个选择语句中捕获5种不同的水类型.

mrc*_*ori 5

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
Run Code Online (Sandbox Code Playgroud)

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

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

  • @IHawk我建议在每种类型之前添加一个空格(即'(Lake)|(River)|(Bay)') - 否则,结果将包含尾随空格(通常你不想要). (2认同)

Fra*_*itt 3

由于您使用的是 9i,最简单的解决方案是使用多个 REPLACE:

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
Run Code Online (Sandbox Code Playgroud)

(我在每个子模式之前添加了一个空格,以避免结果中出现尾随空格)。

或者,您可以尝试将正则表达式的 Java 类加载到数据库中并使用它。