我正在开发一个应用程序,该应用程序涉及评估对车辆所做的修改,并对存储在Oracle 10g数据库中的数字进行一些数字处理。不幸的是,我在数据库中只有一个文本数据,但我需要使用数字而不是文本。我想知道是否有人可以帮助我理解如何使用PLSQL对Oracle 10g数据库中的VARCHAR2列数据执行字符串操作:
例如:我需要在名为CARS的表中获取名为TOP_SPEED的VARCHAR2列,解析其列中的文本数据以将其分解为两个新值,并将这些新值插入到两个新的NUMBER类型列中。 CARS表,TOP_SPEED_KMH和TOP_SPEED_MPH。
TOP_SPEED列中的数据是这样的:例如。 “153公里/小时(94.62英里/小时)”
我想将153.00的值保存到TOP_SPEED_KMH列中,将94.62值保存到TOP_SPEED_MPH列中。
我认为我在查询/脚本中必须做的是:
有人可以确认我走在正确的轨道上吗?如果有人有时间,我也非常感谢任何示例代码。
干杯
答案 0 :(得分:1)
对于解析位,您可能使用REGEXP_SUBSTR或INSTR与SUBSTR
然后使用TO_NUMBER转换为数字
您可以为每个解析创建一个PL / SQL函数,返回数值,并在字段上运行UPDATE查询,或者您可以创建一个PL / SQL过程,其中的游标循环遍历所有数据更新。
以下是一些内置插件的som链接:
http://psoug.org/reference/substr_instr.html http://download.oracle.com/docs/cd/B14117_01/server.101/b10759/functions116.htm
答案 1 :(得分:1)
您甚至可能根本不需要使用PL / SQL。
只要列中的数据一致“99.99 km / h(99.99 m / h)”,您就可以直接使用SQL执行此操作:
UPDATE CARS
SET TOP_SPEED_KMH = TO_NUMBER(SUBSTR(1, (INSTR(UPPER(TOP_SPEED), "KM/H") - 1))),
TOP_SPEED_MPH = <similar substr/instr combination to pull the 99.99 mph out of code>;
设置操作通常比程序操作快得多。
答案 2 :(得分:1)
我认为最好只有top_speed_kmh列,然后摆脱mph。由于一英里内的公里数不会改变,您可以简单地乘以0.6以转换为英里数。因此,您可以在没有mph列的情况下执行与N West建议相同的更新语句: 更新车辆设置TOP_SPEED_KMH = TO_NUMBER(SUBSTR(1,(INSTR(UPPER(TOP_SPEED),“KM / H”)-1)));
每当你需要英里/小时的速度时,就这么做 选择top_speed_kmh * 0.6作为汽车的top_speed_mph;
答案 3 :(得分:1)
我正在开发涉及的应用 评估对...的修改 车辆,并做一些号码 从存储在数据中的数字中碾压 Oracle 10g数据库。不幸的是,我 只有数据库中的文本数据, 但我需要使用数字和 不是文字
听起来你应该有一些数字列来存储这些解析出来的值。而不是总是调用一些解析例程(无论是regexp还是substr或自定义函数),而是遍历表中的所有数据ONCE并填充新的数字字段。您还应该修改ETL过程以填充前进的新数字字段。
如果您需要数字并且可以解析它们,请执行一次(希望在临时区域或至少下班时间),然后输入您想要的数字。现在你可以自由地做算术和其他你想从实数中得到的东西;)
答案 4 :(得分:1)
with s as
(select '153 km/h (94.62 mph)' ts from dual)
select
ts,
to_number(substr(ts, 1, instr(ts, ' ') -1)) speed_km,
to_number(substr(regexp_substr(ts, '\([0-9]+'), 2)) speed_mph
from s
答案 5 :(得分:0)
谢谢大家,很高兴能够使用每个人的输入来得到以下答案:
UPDATE CARS
SET
CAR_TOP_SPEED_KPH =
to_number(substr(CAR_TOP_SPEED, 1, instr(UPPER(CAR_TOP_SPEED), ' KM/H') -1)),
CAR_TOP_SPEED_MPH =
to_number(substr(regexp_substr(CAR_TOP_SPEED, '\([0-9]+'), 2));