数字错误无效

时间:2016-05-11 16:10:20

标签: regex oracle ora-01722

我有一个相关的question,并尝试实施他们对我的问题的答案。 当我尝试使用他们提出的解决方案时,我得到了ORA-01722:无效的数字。

这是我的表

CREATE TABLE TEMP_PARSE_EXIST
( 
PHYS_ST_ADRS        VARCHAR2(64 CHAR),
PHYS_ADRS_LN2       VARCHAR2(64 CHAR),
PHYS_COM_NM         VARCHAR2(50 CHAR),
PROV                VARCHAR2(10 CHAR),
PSTL_CD             VARCHAR2(16 CHAR),
CNTRY               VARCHAR2(50 CHAR),
MAIL_ADRS           VARCHAR2(64 CHAR),
MAIL_ADRS_LN2       VARCHAR2(64 CHAR),
MAIL_COM_NM         VARCHAR2(50 CHAR),
MAIL_PROV           VARCHAR2(10 CHAR),
MAIL_PSTL_CD        VARCHAR2(16 CHAR),
ADRS                VARCHAR2(64),
V_DIRN              VARCHAR2(2),    
V_NUM               VARCHAR2(8),
V_STREET_NAME       VARCHAR2(64),
V_SECOND_LINE       VARCHAR2(64),
V_STREET_TYPE       VARCHAR2(64),
V_POSTAL            VARCHAR2(7),
V_COMM_NM           VARCHAR2(64),
R_REC_TYP_CD        VARCHAR2(1),
ADT_ACT             VARCHAR2(200 CHAR)
);

运行代码的下一部分时,它会在表被截断并从原始数据源重新填充之后出现。我总是确保在运行测试时截断并重新填充,以确保以前的结果不会干扰。

这些首次更新用于确定100 Ave和100th Ave有效。

DECLARE
    ALLOWED_STREETS VARCHAR2(1400 char) := '(ABBEY|ACRES|WHARF|WOOD|WYND)'; --has been cut down for question
BEGIN
--this one is for when the 3rd "word" is one of the street types
--and the 2nd "word" is purly numbers for a building number like 100 street
    UPDATE TEMP_PARSE_EXIST
    SET ADT_ACT = 'CASE 1', V_NUM = REGEXP_SUBSTR(REGEXP_SUBSTR(ADRS, '^\w+(\s?-\s?)\w+'), '\d+$')
    WHERE REGEXP_LIKE(REGEXP_SUBSTR(ADRS, '^\w+(\s?-\s?)\w+\s\w+', 'i'), ALLOWED_STREETS || '$', 'i') --problem line 
    and REGEXP_LIKE(REGEXP_SUBSTR(ADRS, '^\w+(\s?-\s?)\w+'), '^\w+(\s?-\s?)\d+$')
    AND ADT_ACT IS NULL;

--this one is for when the 3rd "word" is one of the street types
--and the 2nd "word" is numbered streets like 1st ave
    UPDATE TEMP_PARSE_EXIST
    SET ADT_ACT = 'CASE 2', V_STREET_NAME = REGEXP_SUBSTR(REGEXP_SUBSTR(ADRS, '^\w+(\s?-\s?)\w+'), '\d+(ST|ND|RD|TH)$')
    WHERE REGEXP_LIKE(REGEXP_SUBSTR(ADRS, '^\w+(\s?-\s?)\w+\s\w+', 'i'), ALLOWED_STREETS || '$', 'i') --problem line
    AND REGEXP_LIKE(REGEXP_SUBSTR(ADRS, '^\w+(\s?-\s?)\w+'), '^\w+(\s?-\s?)\d+(ST|ND|RD|TH)$') 
    AND ADT_ACT IS NULL;
END;

当标记为问题的行被删除时,它会运行,但结果不是我想要的。

所以我正在做的是处理adrs数据,包括建筑物编号,子单元,街道名称,街道类型,方向。我正在尝试解析当子单元和建筑物编号一起被加密时以及它们不是时。因此,我将放置的条件对于可能存在的各种方法都是严格的。

因此,虽然我正在使用的数据中有数字,但它们存储为字符,存储它们的字段是varchar2,并且没有正在执行的数字操作(我知道)。那么为什么无效的数字错误,我该如何解决呢?

1 个答案:

答案 0 :(得分:1)

您将REGEXP_SUBSTR()称为:

REGEXP_SUBSTR(ADRS, '^\w+(\s?-\s?)\w+\s\w+', 'i')

从语法图中可以看出:

the syntax diagram

该函数的第三个参数是位置,您给出的'i'应该是第五个match_param。 Oracle试图将字母i解释为一个数字,因为它期望一个用于位置参数,因此你得到的错误。

您还需要提供位置和出现参数,例如:

REGEXP_SUBSTR(ADRS, '^\w+(\s?-\s?)\w+\s\w+', 1, 1, 'i')

我不确定你是否需要不区分大小写的标志;如果你想匹配ABBEY,Abbey,修道院等,你可以为REGEXP_LIKE做,但它对子串提取似乎没有用;所以你也可以这样做:

REGEXP_SUBSTR(ADRS, '^\w+(\s?-\s?)\w+\s\w+')