0

我有一个相关的问题,并试图实现他们对我的问题的回答。当我尝试使用他们提出的解决方案时,我得到 ORA-01722: invalid number。

这是我的桌子

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,并且没有正在完成的数字操作(我知道)。那么为什么无效号码错误,我该如何解决呢?

4

1 回答 1

1

你打电话给REGEXP_SUBSTR()

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

从语法图中可以看出:

语法图

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

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

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

不过,我不确定您是否需要不区分大小写的标志;您可以REGEXP_LIKE根据需要匹配 ABBEY、Abbey、abbey 等,但它似乎对子字符串提取没有用;所以你也可以这样做:

REGEXP_SUBSTR(ADRS, '^\w+(\s?-\s?)\w+\s\w+')
于 2016-05-11T16:27:18.423 回答