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 用户的 密码 支持哪些特殊字符,不支持哪些字符?

如何使用正则表达式选择字母数字字符

随机生成密码,长度6-10位、不可包含特殊字符、必须包含大写、小写和数字,oracle 如何实现?

sql 使用正则表达式将指定列选择为字母数字(无特殊字符)

oracle怎么查出字段中含有特殊字符的数据?表名:table,字段:col,请直接给出语句,谢谢!