0

我正在使用具有该类型行的表在 Oracle SQL 中开发命令:

company=1&product=12588&version=1

对于我的命令,我需要每行的产品编号和版本,但按列分隔。

我的第一个问题:如何使用不同的 REGEXP_SUBSTR 仅读取产品编号

我的第二个问题:创建新列以显示版本而不重复行的最佳方法是什么?

我希望有一个人可以帮助我。

4

2 回答 2

1

如果数据真的那么简单,那么正则表达式会使代码变得相当简单。比SUBSTR + INSTR选项简单得多。你为什么不想使用正则表达式?因为它是邪恶的,还是……?

  • 第 1 - 4 行中的样本数据
  • product:从列中获取第二个数值
  • version:从列中取出最后一个数值

SQL> with test (col) as
  2    (select 'company=1&product=12588&version=1' from dual union all
  3     select 'company=2&product=52361&version=4' from dual
  4    )
  5  select col,
  6    regexp_substr(col, '\d+', 1, 2) as product,
  7    regexp_substr(col, '\d+$')      as version
  8  from test;

COL                               PRODUCT    VERSION
--------------------------------- ---------- ----------
company=1&product=12588&version=1 12588      1
company=2&product=52361&version=4 52361      4

SQL>

作为

创建新列以显示版本而不重复行的最佳方法是什么?

我不知道那是什么意思。“不重复行”?哪条线?哪个副本?

于 2021-09-27T17:55:34.580 回答
0

要回答您的第一个问题,您可以通过仅组合 ** substr ** 和 ** instr ** 函数来使用下面的 sql。该解决方案利用了instr函数的第四个也是最后一个参数。

select your_column
, substr(your_column
          , instr(your_column, '=', 1, 1) + 1
          , instr(your_column, '&', 1, 1) - instr(your_column, '=', 1, 1) - 1 
   ) company
, substr(your_column
          , instr(your_column, '=', 1, 2) + 1
          , instr(your_column, '&', 1, 2) - instr(your_column, '=', 1, 2) - 1 
   ) product
, substr(your_column
          , instr(your_column, '=', 1, 3) + 1 
  ) version
from (
  select 'company=1&product=12588&version=1' your_column from dual union all
  select 'company=2&product=52361&version=4' your_column from dual
) Your_data
;

演示

但是,我不确定我是否正确理解了您的第二个问题。

于 2021-09-27T15:42:39.090 回答