【发布时间】:2014-09-08 17:25:17
【问题描述】:
我在对象集合 col_a 中有以下数据:
00004719~BBK~US
00004719~SBK~US
00004719~OBK~GB
00004719~IBK~DE
00004720~BBK~US
00004720~SBK~GB
00004725~IBK~IN
Col_a 在数据库中定义为:
create OR REPLACE TYPE col_a AS TABLE OF varchar2(100)
我需要根据上述数据更新 upd_tbl (col_bbk,col_sbk,col_ibk,col_obk) 中的 4 列,以便: 如果 col_a 包含 BBK,则使用事务的 ~ 分隔符的第三个值更新 col_bbk;如果 col_a 包含 SBK,则类似地为事务更新 col_sbk。 事务编号由 col_a 中第一次出现的 ~ 子字符串标识。
transaction_number 是 upd_tbl 中的 pk,upd_tbl 和集合数据之间存在一对多的关系。但是,该集合将 transaction_number 作为其元素的一部分。
transaction_number = regexp_substr(col_a, '[^~]+', 1, 1)
需要输出:对于事务“00004719”,col_bbk = US,col_SBK = US,col_obk = GB,col_ibk = DE。
我目前正在循环中逐行更新各个 col_a 值。 本质上,对于同一个事务“00004719”,更新会根据代码(SBK 等)触发 4 次。
是否可以一次为每个事务编写一次此更新?
以下内容不断出现“sql 命令未正确结束”错误。
UPDATE upd_tbl
SET ctry_bbk = (CASE
WHEN regexp_substr(tam.column_value, '[^~]+', 1, 2) = 'BBK' THEN regexp_substr(tam.column_value, '[^~]+', 1, 3)
ELSE NULL
END),
ctry_sbk = CASE
WHEN regexp_substr(tam.column_value, '[^~]+', 1, 2) = 'SBK' THEN regexp_substr(tam.column_value, '[^~]+', 1, 3)
ELSE NULL
END,
ctry_ibk = CASE
WHEN regexp_substr(tam.column_value, '[^~]+', 1, 2) = 'IBK' THEN regexp_substr(tam.column_value, '[^~]+', 1, 3)
ELSE NULL
END,
ctry_obk = (CASE
WHEN regexp_substr(tam.column_value, '[^~]+', 1, 2) = 'OBK' THEN regexp_substr(tam.column_value, '[^~]+', 1, 3)
ELSE NULL
END)
from (select column_value from table(col_a('00004719~BBK~US','00004719~SBK~US','00004719~IBK~GB','00004719~OBK~IN','00004720~BBK~US','00004720~SBK~RU','00004725~BBK~US'))) tam
where upd_tbl.transaction_number = regexp_substr(tam.column_value, '[^~]+', 1, 1);
【问题讨论】:
-
谢谢。但是,如果 col_a 值在对象集合类型中怎么办?我尝试过这样的事情。我无法在 cmets 中使用我的解决方案。所以,编辑了这个问题。
-
再次检查。向数据透视表添加了合并。
标签: sql oracle11g window-functions analytic-functions