无效号码错误
Invalid number error
我有一个相关的 并试图实施他们对我的问题的回答。
当我尝试使用他们提出的解决方案时,我得到了 ORA-01722: invalid number.
这是我的 table
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)
);
当 运行 执行代码的下一部分时,它出现在 table 得到 t运行 分类并从原始数据源重新填充之后。我总是确保在 运行 进行测试时进行 运行 分类和重新填充,以确保之前的结果不会受到干扰。
这些第一次更新是为了确定 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,并且没有数字操作(据我所知)正在完成.那么为什么会出现无效数字错误,我该如何解决?
您将 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+')
我有一个相关的
这是我的 table
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)
);
当 运行 执行代码的下一部分时,它出现在 table 得到 t运行 分类并从原始数据源重新填充之后。我总是确保在 运行 进行测试时进行 运行 分类和重新填充,以确保之前的结果不会受到干扰。
这些第一次更新是为了确定 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,并且没有数字操作(据我所知)正在完成.那么为什么会出现无效数字错误,我该如何解决?
您将 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+')