Oracle sql:如何使用 regexp_* 将标记带到两列或更多列

Posted

技术标签:

【中文标题】Oracle sql:如何使用 regexp_* 将标记带到两列或更多列【英文标题】:Oracle sql : How to use regexp_* , to take tokens to two or more columns 【发布时间】:2021-04-16 03:47:16 【问题描述】:

如果存在,我如何使用 oracle regexp_*str 拆分 streetnum?目标是创建一个视图 V_MY_USERS,其中包含 3 列 ID、STREET_NUM、STREET_NAME。

MY_USERS - that has two columns

ID    STREET_ADDRESS
-------------------- 
1     991 My Street  # Some records start with street number followed by space
2     Don street     # some records do not have street num, => null

创建一个视图:V_MY_USERS 有 3 列

ID    STREET_NUM       STREET_NAME
----------------------------------
1     991              My Street            
2     null             Don street    

【问题讨论】:

像 99A Celal Bayar Blv. 这样的地址怎么样? @mathguy,来自下面的答案 ... REGEXP_SUBSTR(STREET_ADDRESS, '^\w+') as STREET_NUM ,适用于“ 99A Celal Bayar Blv” 在您的第二个示例中,这会将 Don 作为门牌号。 REGEXP_SUBSTR(STREET_ADDRESS, '^\d\w+') AS STREET_NUM, 【参考方案1】:

我会在这里使用REGEXP_SUBSTRREGEXP_REPLACE

CREATE VIEW V_MY_USERS AS
SELECT
    ID,
    REGEXP_SUBSTR(STREET_ADDRESS, '^\d+') AS STREET_NUM,
    REGEXP_REPLACE(STREET_ADDRESS, '^\d+ ', '') AS STREET_NAME
FROM MY_USERS
ORDER BY ID;

Demo

【讨论】:

对不起,第二个是视图(只是一个查询),更新了我的问题。所以没有更新语句。 @Espresso 重新加载您的页面。 非常感谢。我不知道我可以使用在线 oracle 模拟器 :)。查看查询完美运行。再次感谢。 dbfiddle 是否允许测试 V_MY_USERS? @Espresso 不确定是否可以创建视图,但您不需要这样做,因为视图只是包装了一些底层选择查询。更新是另一回事……您应该真正进行测试。 DBFiddle 确实允许测试更新,但我通常不会打扰。

以上是关于Oracle sql:如何使用 regexp_* 将标记带到两列或更多列的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Oracle中的SQL中的REGEXP_SUBSTR将自定义消息替换为空插槽

Oracle SQL REGEXP 用不同的列值替换特定字符串

Oracle SQL Regexp 仅捕获字符串中的数字

在 oracle sql 中使用 regexp_replace 标准化地址

Oracle SQL 劈开字符串

oracle 正则表达式?=