sql - Oracle SQL 正则表达式 (regexp_substr)
问题描述
我一直在研究并尝试在 Oracle SQL 中使用正则表达式来选择字符串中的子字符串。我只想选择“UT”、“T1”或“T2”值,并且我想选择字符串中最后出现的任何一个值。
“INPUT”列显示我的示例数据,“TARGET”列显示我想要的值,“OUTPUT”显示我使用当前正则表达式语句获得的值
(SELECT regexp_substr(INPUT, '_(UT|T[A-Z]*[1-2]*)', 1, 1, '', 1) FROM table)
(作为说明,我已尝试在上面的语句中将起始索引位置更改为 -1,但不支持)
谢谢
输入
- XXs5_ABC_94_T2_99
- ABs9_AXY_09_UT
- LPs3_SHT9_01_T1_90
- OOs7_POT_0_UT_T1_89
- IPs0_XYS_18_UT_T1_19
- VGs5_POT7_01_T1_15_T2_45
目标
- T2
- 犹他州
- T1
- T1
- T1
- T2
输出
- T2
- 犹他州
- T1
- 犹他州
- 犹他州
- T1
解决方案
您的查询几乎已经正确。只需.*
在模式的开头添加,以强制在输入字符串中尽可能地找到交替的匹配(同时仍然允许匹配整个模式)。
with
table_ (input) as (
select 'XXs5_ABC_94_T2_99' from dual union all
select 'ABs9_AXY_09_UT' from dual union all
select 'LPs3_SHT9_01_T1_90' from dual union all
select 'OOs7_POT_0_UT_T1_89' from dual union all
select 'IPs0_XYS_18_UT_T1_19' from dual union all
select 'VGs5_POT7_01_T1_15_T2_45' from dual
)
select input,
regexp_substr(input, '.*_(UT|T[A-Z]*[1-2]*)', 1, 1, '', 1) as req_substr
from table_
;
INPUT REQ_SUBSTR
------------------------ ------------------------
XXs5_ABC_94_T2_99 T2
ABs9_AXY_09_UT UT
LPs3_SHT9_01_T1_90 T1
OOs7_POT_0_UT_T1_89 T1
IPs0_XYS_18_UT_T1_19 T1
VGs5_POT7_01_T1_15_T2_45 T2
推荐阅读
- c# - 如果值错误,如何清除 setter 中的文本框?
- laravel - Laravel 计划任务:“每 2 分钟”的 cron 语法被忽略
- selenium - 如何为 Selenium 服务器和浏览器之间的通信配置端口
- reactjs - 更新用户后无法读取未定义的属性“hasOwnProperty”
- c# - 对托管在许多 Windows 服务中的 WCF 使用性能计数器
- java - 使用 Java 替换字符串中的模式
- macos - 如何正确签署我的应用程序以使用 task_for_pid() 而不会收到错误代码 5?
- android - 我无法使用搜索器在 Google Play 中找到我的 Android 应用程序,但如果您知道 url,它就在平台中
- c++ - 头文件中模板类实现的模板成员
- python - 如何使用具有不同参数的一个函数创建函数列表?