【问题标题】:SQL replace based on lookup table基于查找表的 SQL 替换
【发布时间】:2017-03-11 15:21:49
【问题描述】:

如何根据查找表替换字符串?

我需要用来自Lookup_TableNew_Value 替换来自Table1Column1 中字符串中任意位置的Lookup_Table 中的所有Old_value 实例。

例如:

表1

"Column1"
'The Quick BC'
'The Quick BD'

查找表

"Old_value"  | "New_Value"
'BC'         | 'Brown Cat'
'BD'         | 'Brown Dog'

Desired_Output

"Column1"
'The Quick Brown Cat'
'The Quick Brown Dog'

【问题讨论】:

  • 你已经尝试了什么?您是否查看过 stackoverflow 上是否有关于如何替换 MySQL 中的字符串的答案?

标签: sql oracle


【解决方案1】:

显而易见的想法是在 LIKE 条件下连接两个表。 outer 连接保证将返回不匹配的输入(不进行任何更改)。但是,这仅适用于每个输入字符串在查找表中找到最多一个子字符串的情况。对于更通用的解决方案,您将需要某种递归查询以及其他规则:如果 BC 和 BCD 都出现在查找表中,并且您有一个像 ABCDE 这样的输入怎么办?哪个优先 - 你会替换 BC 还是 BCD?

with
     Table1 ( Column1 ) as ( 
       select 'The Quick BC' from dual union all
       select 'The Quick BD' from dual
     ),
     Lookup_Table ( Old_value, New_Value) as (
       select 'BC', 'Brown Cat' from dual union all
       select 'BD', 'Brown Dog' from dual
     )
-- end of test data; the solution (SQL query) begins below this line
select column1, replace(t1.column1, lt.old_value, lt.new_value) as new_column1
from   table1 t1 left outer join lookup_table lt
                 on t1.column1 like '%' || lt.old_value || '%'
;


COLUMN1       NEW_COLUMN1
------------  -------------------
The Quick BC  The Quick Brown Cat
The Quick BD  The Quick Brown Dog

【讨论】:

  • 你说的“BCD”是什么意思,你的意思是“BD”吗?
  • 没有。我的意思是,如果您的查找表有另一行,BCD 表示“加拿大大驴”,而您的输入字符串是“ABCDE”,您会选择哪个替换?也许你有一个规则,你只替换一个完整的单词,而不是一个完整的单词的子字符串?这就是我提到的那种“附加规则”(请注意,您原来的问题中没有这样的规则,实际上我的解决方案会将“ABCDE”更改为“ABrown CatDE”!)
猜你喜欢
  • 2021-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
相关资源
最近更新 更多