首页 > 解决方案 > Oracle 多次替换

问题描述

我在 Oracle 表中有未清理且一致的保修优惠列。例如,在这个表中我们有以下数据,我只想保持最高保修期以月为单位(如果不是以月为单位,我想转换它)。例如,从下面的第一个记录来看,18 个月是最高的,我想将数据保存在几个月内,因此“warranty_offrs”将为“18”,记录 #2 将是“12”而不是 12,记录 #6 将是“24”,值将是整数:

warranty_offrs (char 2000 字节):

  1. 记录#1:“一年18个月24周”
  2. 记录#2:“十二个月,八个月,六十天。”
  3. 记录#3:“(30)个月。”
  4. 记录#4:“(60)个月,20周。”
  5. 记录#5:“1年12个月18个月3年1个月”
  6. 记录 #6:“{12} 周,{2} 年,一个月,十二个月。”

数据有时在数月/天/周括号后带有点(因为它来自不同的来源),以及上面的各种组合。我在存储过程中这样做,首先尝试使用替换来获取所有“(”“)”“[”“]”“{”“}”但仍然翻译。

我怎样才能实现它,请告诉我?

标签: sqloraclereplace

解决方案


步骤 2-8 中使用的全局临时表仅包含相关列。

  1. 使用 REPLACE 命令从列中删除各种不相关的字符串,例如括号、点等,并将数据加载到 perm 表中。一些列被转换为小写字母,以便以后计算。此表包含所有列。

  2. 然后我使用您的数据透视代码将字符串值转换为行,例如,warranty_offrs 值“一个月、2 年、3 天”将变为 3 条记录,然后我将其加载到另一个标记为 {table_name_US_ENG} 的全局临时表中(因为存在相同的列在西班牙语中也是如此,有时它被填充,如果它被填充,那么我需要使用该列中的值)。

  3. 对西班牙列重复第 2 步,并在西班牙列有值时将仅透视的记录加载到全局临时 {table_name_ESP} 中。

  4. 创建的查找表有两列:单词、数字列,例如“一”、“1”、“十”、“10”等。这将有助于在步骤 5 中将单词转换为数字

  5. 来自第 2 步的数据和第 3 步表对第 4 步中的查找执行查找,并获取单词的数值。“1”代表“一”,“10”代表“十”。为了保持时间段(年/月等),我使用 substr 将两个值连接回来。现在我所有的数值都是数字并且有期限(年/天)。此数据被加载到另一个全局临时表中(将重复西班牙列值到单独的表)。

  6. 下一步是将它们转换为月份。由于这些可能性很少,我使用 case 语句并将它们转换为月份,并加载到另一个全局临时表中(此步骤将针对西班牙数据重复)

  7. 然后我执行以下操作以从 us_eng GTT 表中获取 us_eng 列的最大月份:select id, max(mth_us_eng) keep (dense_rank first order by id)max_mth from gtt_table_us_eng。然后将结果插入到全局临时表中。(此 sql 对带有西班牙列的全局临时表重复以获得最大月份)

  8. 左外连接英语(左表)和西班牙语(右)表,并且只获取匹配插入到最后一个全局临时表的记录(呸!)

  9. 现在使用步骤 1 中的 perm 表和步骤 8 中的全局临时表执行 INNER JOIN,并将结果加载到最终 perm 表中。

问题:我们如何将数字与字符串分开?在某些情况下,列值没有单个空格,而是像“18months”而不是“18months”。

注释:

  • 步骤 1 中有足够的 REPLACE 函数,而不是我邻居枫树中的分支。
  • 我希望我使用 GTT 不会加剧全球变暖!(虽然我试图把 12 个月搞砸到 24 个月)。
  • 希望西班牙语列查找值提高了我下次访问墨西哥时的对话技巧。

欢迎任何调整代码的建议。:)


推荐阅读