Oracle查询在特殊字符后选择单独的字母+数字和数字
Posted
技术标签:
【中文标题】Oracle查询在特殊字符后选择单独的字母+数字和数字【英文标题】:Oracle Query to select separate alphabet+numbers and numbers after special character 【发布时间】:2016-09-21 11:11:40 【问题描述】:我在 oracle 中编写查询,我需要将特殊字符后的字母+数字和数字分隔为 2 个不同的列
例如。
列值为 ABC 123#78800,XYZ#4666,PQR 444#9900 需要输出 第 1 列:ABC 123,XYZ,PQR 444 第 2 栏:78800,4666,9900 我试过以下查询: 从对偶中选择 TRANSLATE('ABC 123#78800,XYZ#4666,PQR 444#9900 ','ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789#','ABCDEFGHIJKLMNOPQRSTUVWXYZ')。
输出是缺少“ABC ,XYZ,PQR”数字
【问题讨论】:
这是一个糟糕的设计,你应该大胆地考虑改变它。 请阅读***.com/help/how-to-ask。提出问题,向我们展示您已经尝试过的方法以及无效的方法。 【参考方案1】:你需要的是regex
with table_name as
(
select 'ABC 123#78800,XYZ#4666,PQR 444#9900' col_name from dual
)
select
REGEXP_REPLACE(col_name,'#([^#,])*', null) alphabet_num
,REGEXP_REPLACE(col_name,'([^#,])*#', null) num_value
from
table_name;
已编辑:按照MTO
的建议删除一些冗余字符
【讨论】:
正则表达式[^#,^\,]
将查找不是#
、,
、^
、\
或,
(再次)的单个字符。我不认为它正在做你期望它做的事情。
@MT0 谢谢你的建议。已编辑。
@VineetPalan 您应该将您的查询更新为我的新答案
是的..Pham 和@MT0【参考方案2】:
Oracle 设置:
CREATE TABLE table_name ( col VARCHAR2(100) );
INSERT INTO table_name VALUES ( 'ABC 123#78800,XYZ#4666,PQR 444#9900' );
CREATE TYPE key_value_pair AS OBJECT(
key VARCHAR2(20),
value NUMBER(10)
);
/
CREATE TYPE key_value_pair_table AS TABLE of key_value_pair;
/
查询:
SELECT *
FROM table_name t,
TABLE(
CAST(
MULTISET(
SELECT REGEXP_SUBSTR( t.col, '(^|,)([^,#]+)#(\d+)', 1, LEVEL, NULL, 2 ),
TO_NUMBER(
REGEXP_SUBSTR( t.col, '(^|,)([^,#]+)#(\d+)', 1, LEVEL, NULL, 3 )
)
FROM DUAL
CONNECT BY LEVEL <= REGEXP_COUNT( t.col, '(^|,)([^,#]+)#(\d+)' )
)
AS key_value_pair_table
)
);
输出:
COL KEY VALUE
----------------------------------- ------- -----
ABC 123#78800,XYZ#4666,PQR 444#9900 ABC 123 78800
ABC 123#78800,XYZ#4666,PQR 444#9900 XYZ 4666
ABC 123#78800,XYZ#4666,PQR 444#9900 PQR 444 9900
【讨论】:
以上是关于Oracle查询在特殊字符后选择单独的字母+数字和数字的主要内容,如果未能解决你的问题,请参考以下文章
Oracle:一个查询,它计算字符串中所有非字母数字字符的出现次数
ORACLE 用户的 密码 支持哪些特殊字符,不支持哪些字符?