Я хочу создать REGEX DEFINITION в Oracle SQL, который вернет некоторое количество строк с числом с плавающей запятой из строки. Как это сделать?
case1 (n = 4: 48-48h, 72-72h, 96-96h, 120-120h)
n = 4> 4 записей на диапазон, полученные значения будут: 48,00, 72,00, 96,00 120,00
case2 (n = 5: 0-0h, 24,21-24.21h, 47,77-47.75h, 71,75-71.75h, 96,08-96.08h)
n = 5> 5 записей на диапазон, полученные значения будут: 00.00, 24.21, 47.77, 71.75, 96.08
Вход:
select REGEXP_SUBSTR('(n=4: 48-48h, 72-72h, 96-96h, 120-120h)', MY_REGEX_DEFINITION ) as X from dual;
выходные строки:
X
48.00
72.00
96.00
120.00
Пожалуйста, покажите свой образец ввода и ожидаемый результат!
ваш входной sql не работает, что именно вы хотите?
Я хочу определить MY_REGEX_DEFINITION в SQL.


Я нашел пример того, как разбить строку, так как вам сначала нужно сделать это, чтобы найти все числа в строке. Вот моя переработка этого примера, чтобы он соответствовал вашему вопросу. К сожалению, он возвращает пустую строку в конце, но это должно быть что-то для начала.
SELECT CAST(REGEXP_SUBSTR(result_row, '[^=]\d+\.?\d*' ) AS NUMBER)
FROM (
SELECT
TRIM(REGEXP_SUBSTR('(n=5: 0-0h, 24.21-24.21h, 47.77-47.75h, 71.75-71.75h, 96.08-96.08h)', '[^ ]+h', 1, lines.column_value)) result_row
FROM dual,
TABLE (CAST (MULTISET
(SELECT LEVEL FROM dual
CONNECT BY instr('(n=5: 0-0h, 24.21-24.21h, 47.77-47.75h, 71.75-71.75h, 96.08-96.08h)', '-', 1, LEVEL - 1) > 0
) AS sys.odciNumberList ) ) lines
ORDER BY lines.column_value)//
Это статья Я взял пример кода из.
Я обнаружил две ошибки: из пары 22.21-24.21h запрос возвращает второе число, а не первое. Для '(n = 2: 0-0h, 24.09-0h)' запрос вернет только одну строку со значением 0.
Из вашего вопроса не было ясно, что вам нужно первое число, а второе было легче всего сопоставить из-за буквы «h».
@Cugar, я обновил шаблоны, чтобы они соответствовали обоим вызовам REGEXP_SUBSTR, так что возвращается первое число. По-прежнему возвращена одна дополнительная пустая строка.
Я выделил первый номер жирным шрифтом. Спасибо, теперь работает :)
Как изменить этот SQL, чтобы он также работал с case '(n = 3: 0-0h, 0,05-0,05h, -0,11- -0,12h)'? Теперь он возвращает только положительные числа: 0, 0,05 и 0,11, а не -0,11.
... и как вернуть только строки, когда значение x <y во всех парах чисел (например, 24.21-24.22h) в строке. Заранее спасибо!
Пожалуйста, покажите свой образец ввода и ожидаемый результат!