regex 正则表达式Oracle SQL:处理多个案件

e0bqpujr  于 2022-11-18  发布在  Oracle
关注(0)|答案(3)|浏览(104)

我使用Regex Substring来过滤掉开头为“p”、结尾在“-”之前的值。p后面跟有6位数字。
我的代码:

code,REGEXP_SUBSTR(CODE,'^[p][^-]+')

| CODE|REGEXP_SUBSTR(CODE,'^[P][^-]+')|
| - -|- -|
| p700401-显示器|p700401型|
| 第791701页-|p791701蛋白|
| 100-,第788001页-,|零值|
这就是结果,但我很难处理像第三排这样的案件。
100-,p788001-
有人能指导我处理这类案件吗

rnmwe5a2

rnmwe5a21#

如果要匹配以逗号分隔的字符串中的完整术语,则可以用途:

SELECT code,
       REGEXP_SUBSTR(code, '(^|,)(p\d{6})-(,|$)', 1, 1, NULL, 2) AS result
FROM   table_name;

其中,对于示例数据:

CREATE TABLE table_name (code) as
  SELECT 'p700401-' FROM DUAL UNION ALL
  SELECT 'p791701-' FROM DUAL UNION ALL
  SELECT '100-,p788001-,' FROM DUAL UNION ALL
  SELECT '123-,p456789-xyz,p987654-' FROM DUAL UNION ALL
  SELECT 'p111111-,p222222-not_this,p333333-,p444444-' FROM DUAL;

输出:
| 代码|结果|
| - -|- -|
| p700401-显示器|p700401型|
| 第791701页-|p791701蛋白|
| 100-,第788001页-,|p788001型|
| 123-,第456789页-某某,第987654页-|p987654型|
| 在此情况下,请使用以下命令:|p111111蛋白酶|

显示多个术语

如果要从字符串中删除不匹配的术语,请执行以下操作:

SELECT code,
       LTRIM(
         REGEXP_REPLACE(
           ',' || REPLACE(code, ',', ',,') || ',',
           '((,p\d{6})-,)|,.*?,',
           '\2'
         ),
         ','
       ) AS result
FROM   table_name;

其中,输出:
| 代码|结果|
| - -|- -|
| p700401-显示器|p700401型|
| 第791701页-|p791701蛋白|
| 100-,第788001页-,|p788001型|
| 123-,第456789页-某某,第987654页-|p987654型|
| 在此情况下,请使用以下命令:|第111111页、第333333页、第444444页|
如果要将列表拆分为多行,请执行以下操作:

SELECT t.code,
       i.*
FROM   (
         SELECT code,
                ',' || REPLACE(code, ',', ',,') || ',' AS double_delims
         FROM   table_name
       ) t
       INNER JOIN LATERAL (
         SELECT LEVEL As item,
                REGEXP_SUBSTR(double_delims, ',(p\d{6})-,|,(.*?),', 1, LEVEL, NULL, 1)
                  AS value
         FROM   DUAL
         CONNECT BY LEVEL <= REGEXP_COUNT(double_delims, ',(p\d{6})-,|,(.*?),')
       ) i
       ON (i.value IS NOT NULL);

输出:
| 代码|项目|价值|
| - -|- -|- -|
| p700401-显示器|一个|p700401型|
| 第791701页-|一个|p791701蛋白|
| 100-,第788001页-,|2个|p788001型|
| 123-,第456789页-某某,第987654页-|三个|p987654型|
| 在此情况下,请使用以下命令:|一个|p111111蛋白酶|
| 在此情况下,请使用以下命令:|三个|第333333页|
| 在此情况下,请使用以下命令:|四个|第444444页|
fiddle

a64a0gku

a64a0gku2#

对于您发布的示例数据,这将返回您想要的结果(即,“p”后跟6位数字):

SQL> with test (code) as
  2    (select 'p700401-' from dual union all
  3     select 'p791701-' from dual union all
  4     select '100-,p788001-,' from dual
  5    )
  6  select code,
  7         regexp_substr(code, 'p\d{6}') result
  8  from test;

CODE           RESULT
-------------- --------------
p700401-       p700401
p791701-       p791701
100-,p788001-, p788001

SQL>
avwztpqn

avwztpqn3#

对 , 我 的 两 点 意见 是 使用 REGEXP_REPLACE()

CREATE TABLE tst (code) as
  SELECT 'p700401-' FROM DUAL UNION ALL
  SELECT 'p791701-' FROM DUAL UNION ALL
  SELECT '100-,z123456' FROM DUAL UNION ALL
  SELECT '100-,p788001-,' FROM DUAL UNION ALL
  SELECT 'p788001-,100-' FROM DUAL UNION ALL
  SELECT '123-,p456789-xyz,p987654-' FROM DUAL;

SELECT
  code, REGEXP_REPLACE(REGEXP_REPLACE(code, '(p\d{6})-|.', '\1'), '(\d)(p)', '\1,\2') AS result
FROM tst

中 的 每 一 个
结果 :
| 代码|结果|
| - -| - -|
| p700401 - 显示 器|p700401 型|
| 第 791701 页 -| p791701 蛋白|
| 100 - , 编号 Z123456|零 值|
| 100 - , 第 788001 页 - ,|p788001 型|
| 第 788001 页 - , 100 页 -| p788001 型|
| 123 - , 第 456789 页 - 某某 , 第 987654 页 -|第 456789 页 、 第 987654 页|
这 是 一 个 嵌套 语句 , 因为 它 不 支持 每个 给定 链接 的 方便 的 正则 表达式 语法 。
第 一 个 正则 表达式 模式 应该 是 用来 替换 任何 你 想要 的 以外 的 东西 , 参见 在线 的 demo 。 第 二 个 是 用来 插入 逗号 来 分隔 这些 值 , 参见 demo

相关问题