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