【发布时间】:2016-05-10 22:08:56
【问题描述】:
我正在使用连接到 Oracle 11g 的 TOAD。
我正在解析地址字段,该字段将包含建筑物编号、街道名称、街道类型、方向、子单元和公民号码后缀类型。
由于允许输入地址并且仍然有效的复杂性(或者只是有我现在忽略的不正确信息)我不得不做一些非常具体的正则表达式来分解建筑物编号,子单位和公民号码后缀类型。
我在更新单个字段之前使用过 case 语句
UPDATE TEMP_PARSE_EXIST
SET ADT_ACT =
CASE
WHEN REGEXP_LIKE(ADRS, 'P\.?\s?O\.?\s+BOX', 'i') THEN 'PO BOX'
WHEN REGEXP_LIKE(ADRS,'(\s|^)(RR|GD)(\s|$)', 'i') THEN 'QUERY ERROR: RR OR GD'
ELSE NULL
END
WHERE ADT_ACT IS NULL;
但我现在需要的是不同的,因为我将要更新的字段将取决于具体情况,并且它不断给我一个缺少设置关键字的错误。
UPDATE TEMP_PARSE_EXIST
CASE
WHEN REGEXP_LIKE(REGEXP_SUBSTR(ADRS, '^\w+(\s?-\s?)\w+\s\w+', 'i'), '(ABBEY|ACRES|ALLÉE|ALLEY|AUT|AUTOROUTE|AV|AVE|AVENUE|BAY|BEACH|BEND|BLVD|BOUL|BOULEVARD|BYPASS|WYND)$', 'i') THEN
CASE
WHEN REGEXP_LIKE(REGEXP_SUBSTR(ADRS, '^\w+(\s?-\s?)\w+'), '^\w+(\s?-\s?)\d+$') THEN SET ADT_ACT = 'CASE 1', V_NUM = REGEXP_SUBSTR(REGEXP_SUBSTR(ADRS, '^\w+(\s?-\s?)\w+'), '\d+$')
WHEN REGEXP_LIKE(REGEXP_SUBSTR(ADRS, '^\w+(\s?-\s?)\w+'), '^\w+(\s?-\s?)\d+(ST|ND|RD|TH)$') THEN SET ADT_ACT = 'CASE 2', V_STREET_NAME = REGEXP_SUBSTR(REGEXP_SUBSTR(ADRS, '^\w+(\s?-\s?)\w+'), '\d+(ST|ND|RD|TH)$')
ELSE SET ADT_ACT = 'FIRST ERROR SPOT'
END
END
WHERE ADT_ACT IS NULL;
这只是将这些信息分开解析的许多案例的开始。所以后面会有更多,嵌套的case语句很有用。是的,这可以通过常规的 case 语句来完成,但是行会更长,并且会重复工作。
我在嵌套 case 语句中找到的源始终用于 select 语句或 plsql 中,我需要它用于 UPDATE。 https://community.oracle.com/thread/1094856?start=0&tstart=0
【问题讨论】:
标签: oracle nested sql-update case