Oracle SQL 查询中的正则表达式 - 仅限数字和句点

Posted

技术标签:

【中文标题】Oracle SQL 查询中的正则表达式 - 仅限数字和句点【英文标题】:Regex in Oracle SQL Query - numbers and periods only 【发布时间】:2020-09-29 18:58:14 【问题描述】:

在 Oracle SQL 查询中,有一个字段包含以下内容(示例):

"ID Card": 0.29333333333333333 or "Speedtest": 0.8166666666666667

例如,我可以使用 RegEx 来输出查询中的字段,以便只保留数字和句点吗?

例子:

Select ID, CREATEDFORMAT, INSERT_TS, regexp_substr(SCORE, '[^0-9]') xSCORE FROM MYTABLE

但是对于[^ 0-9],我只有没有点的数字。

【问题讨论】:

这是 JSON 吗?如果是这样,那么字符串函数不是最合适的,您可以改用 JSON 函数。 所以使用 (/[+-^?\d+((\.|\,)\d+)?/) 我成功地只读取了 nline RegEx 中的数字和点。但这在 Oracle 中不起作用 不,是 Oracle SQL 查询 好的,我找到了解决方案。 regexp_substr(SCORE, '[[:digit:]]+[.][[:digit:]]1,6') xSCORE 如果数字是没有小数点或小数点后没有数字的整数(整数),您的正则表达式解决方案将不起作用。此外,如果数字为负数,您的正则表达式会将数字作为正数返回。 【参考方案1】:

如果您使用的是 Oracle 数据库 12.1.0.2 或更高版本,并且您尝试解析的数字始终在 JSON 对象中,则可以使用 JSON_VALUE 函数提取信息。

查询

WITH
    sample_data
    AS
        (SELECT '"ID Card": 0.29333333333333333' AS sample_val FROM DUAL
         UNION ALL
         SELECT '"Speedtest": 0.8166666666666667' FROM DUAL)
SELECT s.sample_val, json_value (s.sample_val, '$.*') AS number_val
  FROM sample_data s;

结果

                          SAMPLE_VAL             NUMBER_VAL
____________________________________ ______________________
"ID Card": 0.29333333333333333        0.29333333333333333
"Speedtest": 0.8166666666666667        0.8166666666666667

【讨论】:

【参考方案2】:

使用

REGEXP_SUBSTR(SCORE, '[-+]?[0-9]*\.?[0-9]+')

见proof

说明

--------------------------------------------------------------------------------
  [-+]?                    any character of: '-', '+' (optional
                           (matching the most amount possible))
--------------------------------------------------------------------------------
  [0-9]*                   any character of: '0' to '9' (0 or more
                           times (matching the most amount possible))
--------------------------------------------------------------------------------
  \.?                      '.' (optional (matching the most amount
                           possible))
--------------------------------------------------------------------------------
  [0-9]+                   any character of: '0' to '9' (1 or more
                           times (matching the most amount possible))

【讨论】:

【参考方案3】:

使用:REGEXP_SUBSTR (s.sample_val, '[+-]?[0-9]+[\.]?[0-9]+')

查看此演示:https://dbfiddle.uk/?rdbms=oracle_18&fiddle=76c2b3be1d7d266f217d6b0541478c17

结果:

SAMPLE_VAL                          NUMBER_VAL
----------------------------------  --------------------
"ID Card": 0.29333333333333333    0.29333333333333333
"Speedtest": 0.8166666666666667   0.8166666666666667
"texts": 12.3456                  12.3456
"texts": -65                      -65

这是对@Ryszard Czech 帖子的更改。

【讨论】:

以上是关于Oracle SQL 查询中的正则表达式 - 仅限数字和句点的主要内容,如果未能解决你的问题,请参考以下文章

oracle sql查询中用in列表中最大表达式数大于1000的处理

为了对存储在 Oracle db 中的数据运行搜索查询,在 PL/SQL 中使用 REGEXP 是不是比在 Java 正则表达式中获取所有数据并过滤它更快?

需要在oracle中查询下面的正则表达式[关闭]

SQL 中的正则表达式

oracle10g中,如何查询正则表达式匹配指定字符串的匹配个数?

oracle 字符串匹配查询