Oracle -从字符串中删除特定空格

zxlwwiss  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(141)

我们有一些未格式化的数据已经传递给我们,需要将其转换为分钟:

2hr
2hr 30min
3 hours
3 hr
3 hrs
3hr
3hrs
4 hours
4 hrs
4 hrs 10 mins
6 hrs

我想做的是从string中删除第一个空格,这将导致:

2hr
2hr 30min
3hours
3hr
3hrs
3hr
3hrs
4hours
4hrs
4hrs 10 mins
6hrs

然后,我可以把第一个“单词”转换成分钟,去掉所有非数字的东西,然后乘以60。之后,我可以把第一个单词之后的每一个都加到结果中。但我只需要去掉第一个空格。
我在考虑REGEXP_REPLACE,但不确定如何只使用第一个空格。
多谢了!

jdg4fx2g

jdg4fx2g1#

你不需要去掉空格。您可以找到后跟零或多个空格的数字,然后是hm表示小时和分钟。

SELECT duration,
       COALESCE(TO_NUMBER(REGEXP_SUBSTR(duration, '(\d+)\s*h', 1, 1, 'i', 1)), 0) * 60
       + COALESCE(TO_NUMBER(REGEXP_SUBSTR(duration, '(\d+)\s*m', 1, 1, 'i', 1)), 0)
         AS minutes
FROM   table_name;

或十进制小时和分钟:

SELECT duration,
       COALESCE(TO_NUMBER(REGEXP_SUBSTR(duration, '(\d+\.?\d*|\.\d+)\s*h', 1, 1, 'i', 1)), 0) * 60
       + COALESCE(TO_NUMBER(REGEXP_SUBSTR(duration, '(\d+\.?\d*|\.\d+)\s*m', 1, 1, 'i', 1)), 0)
         AS minutes
FROM   table_name;

其中,对于样本数据:

CREATE TABLE table_name (duration) AS
SELECT '2hr' FROM DUAL UNION ALL
SELECT '2hr 30min' FROM DUAL UNION ALL
SELECT '3 hours' FROM DUAL UNION ALL
SELECT '3 hr' FROM DUAL UNION ALL
SELECT '3 hrs' FROM DUAL UNION ALL
SELECT '3hr' FROM DUAL UNION ALL
SELECT '3hrs' FROM DUAL UNION ALL
SELECT '4 hours' FROM DUAL UNION ALL
SELECT '4 hrs' FROM DUAL UNION ALL
SELECT '4 hrs 10 mins' FROM DUAL UNION ALL
SELECT '6 hrs' FROM DUAL UNION ALL
SELECT '1.5 hrs' FROM DUAL UNION ALL
SELECT '.25 hrs' FROM DUAL UNION ALL
SELECT '1.1m' FROM DUAL;

输出:
| 持续时间|分钟|
| --|--|
| 2hr| 120 |
| 2小时30分钟| 150 |
| 3小时| 180 |
| 3小时| 180 |
| 3小时| 180 |
| 3hr| 180 |
| 3小时| 180 |
| 4小时| 240 |
| 4小时| 240 |
| 4小时10分钟| 250 |
| 6小时| 360 |
| 1.5小时| 90 |
| 0.25小时| 15 |
| 1.1m |1.1|
fiddle

相关问题