【问题标题】:Oracle REGEXP_SUBSTR to SUBSTR + INSTROracle REGEXP_SUBSTR 到 SUBSTR + INSTR
【发布时间】:2021-06-17 13:33:10
【问题描述】:

我正在尝试从 oracle 转换以下代码:

SELECT DISTINCT REPLACE(SUBSTR (REGEXP_SUBSTR (code,'[^,]+',1,LEVEL),2,8),']','') code
FROM DUAL 
CONNECT BY REGEXP_SUBSTR (code, '[^,]+', 1, LEVEL) IS NOT NULL;

请帮忙转换成一些SUBSTR/INSTR组合或者CASE函数。

谢谢。

问候,

【问题讨论】:

  • 你明白这个sn-p是做什么的吗?你是说你想要相同的行为但使用正则表达式?你希望用什么来代替它?你有字符串code的内容的例子吗?
  • 请提供示例数据、期望的结果以及代码的用途说明。另外,你为什么要这样做?

标签: sql oracle substring


【解决方案1】:

您的代码不起作用,因为DUAL 表没有code 列;但是,如果我们假设您使用的是具有该列的其他表:

CREATE TABLE table_name ( code ) AS
SELECT '[1],[22],[333],[4444],[55555],[666666],[7777777],[88888888],[999999999],[0000000000]' FROM DUAL

然后你可以使用递归子查询分解子句:

WITH rsqfc ( code, start_pos, end_pos ) AS (
  SELECT code,
         1,
         INSTR( code, ',', 1 )
  FROM   table_name
UNION ALL
  SELECT code,
         end_pos + 1,
         INSTR( code, ',', end_pos + 1 )
  FROM   rsqfc
  WHERE  end_pos > 0
)
SELECT DISTINCT
       REPLACE(
         CASE end_pos
         WHEN 0
         THEN SUBSTR( code, start_pos + 1, 8 )
         ELSE SUBSTR( code, start_pos + 1, LEAST( end_pos - start_pos - 1, 8 ) )
         END,
         ']'
       ) AS code
FROM   rsqfc;

哪些输出:

|代码 | | :------- | | 99999999 | | 4444 | | 55555 | | 1 | | 333 | | 22 | | 666666 | | 88888888 | | 00000000 | | 7777777 |

db小提琴here

【讨论】:

  • 非常感谢亲爱的 :-) 让我试试这个。如有任何问题,我们会尽快回复。
  • 还有一个问题,我有一个程序,其中我有一个光标,实际上如下所示:
  • @ImranQasim 如果这是一个不同的问题,那么将其作为一个新问题提出;不要将其添加为对另一个问题的评论。
猜你喜欢
  • 2017-04-30
  • 1970-01-01
  • 1970-01-01
  • 2018-09-25
  • 2021-12-18
  • 1970-01-01
  • 2015-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多