Множественное регулярное выражение, не использующее level

#sql #regex #oracle #oracle11g

#sql #регулярное выражение #Oracle #oracle11g

Вопрос:

Я хочу разделить строки одну за другой и превратить их в строку. Я запросил его только для получения арифметического оператора не для числа

 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. может ли ваша строка содержать отрицательные числа и скобки? (например '(-1 10)*5' ). Если да, то как должен выглядеть результат? Выводится ли минус в отдельной строке, даже если это часть числа? А как насчет такого числа, как 1.3e2 ?

Ответ №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
  

Я использую этот запрос для его работы, но он медленный.

Комментарии:

1. Я не буду использовать ОБЪЕДИНЕНИЕ любым другим способом?

2. Оно должно быть UNION ALL вместо UNION . UNION пытается объединить общие элементы в один, что в вашем случае необязательно.

Ответ №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.6 e-5), и я предположил, что отрицательные числа должны иметь знак минус в отдельной строке.