【问题标题】:Multiple Regex not using level多个正则表达式不使用级别
【发布时间】:2019-09-14 09:04:51
【问题描述】:

我想将字符串一一分开,成为行。 我查询它只得到算术运算符而不是数字

SELECT
    REGEXP_SUBSTR('141*47+2/5','[^0-9]+| [0-9]+',1,LEVEL) AS FORMULA
FROM DUAL
CONNECT BY REGEXP_SUBSTR ('141*47+2/5','[^0-9]+| [0-9]+',1,LEVEL) IS NOT NULL

输入

141*47+2/5

结果:

*
--
+
--
/

我的期望:

141
--
*
--
47
---
+
--
2
--
/
--
5

【问题讨论】:

  • 你的字符串可以包含负数和括号吗? (例如'(-1+10)*5')。如果是这样,输出应该是什么样子?即使它是数字的一部分,减号是否会出现在单独的行上?那么像1.3e2 这样的数字呢?

标签: sql regex oracle oracle11g


【解决方案1】:
SELECT
    REGEXP_SUBSTR('141*47+2/5','[^0-9]+| [0-9]+',1,LEVEL) AS FORMULA
FROM DUAL
CONNECT BY REGEXP_SUBSTR ('141*47+2/5','[^0-9]+| [0-9]+',1,LEVEL) IS NOT NULL
UNION
SELECT
    REGEXP_SUBSTR('141*47+2/5','[0-9]+',1,LEVEL) AS FORMULA
FROM DUAL
CONNECT BY REGEXP_SUBSTR ('141*47+2/5','[0-9]+',1,LEVEL) IS NOT NULL

我使用这个查询它的工作,但它很慢。

【讨论】:

  • 我不会使用UNION,还有其他方式吗?
  • 应该是 UNION ALL 而不是 UNIONUNION 尝试将常见元素组合为一个,这在您的情况下不是必需的。
【解决方案2】:

这是一种方法:

WITH sample_data AS (SELECT '141*47+2/5' str FROM dual UNION ALL
                     SELECT '100*(10 + 2)' str FROM dual UNION ALL
                     SELECT '-1*5+2/6' str FROM dual UNION ALL
                     SELECT '(10+2)*5' str FROM dual)
SELECT str,
       regexp_substr(str, '([[:digit:]]+|[\*/+-\(\)]{1})', 1, LEVEL) sub_str
FROM   sample_data
CONNECT BY regexp_substr(str, '([[:digit:]]+|[\*/+-\(\)]{1})', 1, LEVEL) IS NOT NULL
           AND PRIOR str = str
           AND PRIOR sys_guid() IS NOT NULL;

STR          SUB_STR
------------ ------------
(10+2)*5     (
(10+2)*5     10
(10+2)*5     +
(10+2)*5     2
(10+2)*5     )
(10+2)*5     *
(10+2)*5     5
-1*5+2/6     -
-1*5+2/6     1
-1*5+2/6     *
-1*5+2/6     5
-1*5+2/6     +
-1*5+2/6     2
-1*5+2/6     /
-1*5+2/6     6
100*(10 + 2) 100
100*(10 + 2) *
100*(10 + 2) (
100*(10 + 2) 10
100*(10 + 2) +
100*(10 + 2) 2
100*(10 + 2) )
141*47+2/5   141
141*47+2/5   *
141*47+2/5   47
141*47+2/5   +
141*47+2/5   2
141*47+2/5   /
141*47+2/5   5

注意我没有考虑科学格式的数字(例如 1.3e+2、2.6e-5),并且我假设负数应该在单独的行上有减号。

【讨论】:

    猜你喜欢
    • 2022-06-19
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多