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 正则表达式中获取所有数据并过滤它更快?