oracle 匹配字符串的正则表达式,该字符串中的数字用下划线分隔,然后查看这些数字是否在特定范围内

cczfrluj  于 2023-04-29  发布在  Oracle
关注(0)|答案(1)|浏览(224)

我需要创建一个oracle sql逻辑,它计算一个字符串,其中数字用下划线分隔,并需要找出这些数字是否福尔斯一个范围内。
我有一个字符串1_2_5_11_23_48_55_67_98或任何包含下划线分隔的数字的字符串,数字将在1到99之间。
Oracle SQL逻辑需要评估此字符串并查看是否:

  • 如果字符串包含number = '1'以及'50'和'99'之间的任何其他数字,并且不包含值'2'和'49'之间的任何数字,则返回'_'被'替换的字符串。|'.
  • 如果字符串包含number = '1'以及介于'2'和'49'之间的任何其他数字,并且可选地,如果存在介于'50'和'99'之间的任何其他数字),则通过删除'1'并将'_'替换为'来返回修改后的字符串|'.
  • 如果string不包含number = '1',但包含其他数字,则返回字符串,其中'_'替换为'|'.

如果这可以完全使用字符串操作来完成,那也很好。否则,也将需要使用正则表达式的解决方案。

tvmytwxo

tvmytwxo1#

你的逻辑似乎可以简化为:

  • 如果字符串包含1和2到49之间的至少一个数字,则从字符串中删除1。
  • 然后,对于所有字符串,将所有下划线字符替换为管道字符。

其可以被实现为:

SELECT value,
       REPLACE(
         CASE
         WHEN '_' || value || '_' LIKE '%_1_%'                -- Contains 1
         AND  REGEXP_LIKE(value, '(^|_)([2-9]|[1-4]\d)($|_)') -- Contains 2-49
         THEN TRIM(
                BOTH '_' FROM 
                REPLACE(
                  REPLACE(
                    '_' || REPLACE(value, '_', '__') || '_',
                    '_1_'
                  ),
                  '__',
                  '_'
                )
              )
         ELSE value
         END,
         '_',
         '|'
       ) AS updated_value
FROM   table_name

其中,对于样本数据:

CREATE TABLE table_name (value) AS
SELECT '1_2_5_11_23_48_55_67_98' FROM DUAL UNION ALL
SELECT '2_49_1' FROM DUAL UNION ALL
SELECT '99_1_50' FROM DUAL UNION ALL
SELECT '2_3_49' FROM DUAL UNION ALL
SELECT '51_51_98_99_97' FROM DUAL UNION ALL
SELECT '1' FROM DUAL UNION ALL
SELECT '99_2' FROM DUAL;

输出:
| 价值|更新值|
| --------------|--------------|
| 1_2_5_11_23_48_55_67_98||25|11|23|48|55|67|98|
| 2_49_1||二四九|
| 99_1_50|九九||一五零|
| 2_3_49||二三|四十九|
| 51_51_98_99_97|51|51|98|99|97|
| 1|1|
| 99_2|九九|二|
fiddle

相关问题