拆分 table 的列值并跳过一些单词

split column value of a table and skip some words

希尔所有,

我有一个table,数量大约是200M。它有一列包含由“~”分隔的数据。我要解析它。

例如:

Column1
A~B~C~D~E~F

Result :
Column_new1
A~C~E

我只想跳过第 2,4,6,n 个。字。我不要plsql。我需要 sql 查询。而且table很大,我也需要性能。

我使用 substr,instr 函数,我可以解析。但是运行起来真的很慢..

感谢您的帮助。

这是一个正则表达式选项。看起来 不错 ,不是 PL/SQL,工作正常(2 行)。恐怕 任何东西 都会 运行 减慢 2 亿行。

SQL> with test (id, col) as
  2     (select 1, 'A~B~C~D~E~F' from dual union all
  3      select 2, 'M~N~O~P~Q-R' from dual
  4     )
  5  select id,
  6         regexp_substr(col, '\w+', 1, 1) || '~' ||
  7         regexp_substr(col, '\w+', 1, 3) || '~' ||
  8         regexp_substr(col, '\w+', 1, 5) result
  9  from test;

        ID RESULT
---------- -----------------------------------
         1 A~C~E
         2 M~O~Q

SQL>

如果您追求性能,请使用 INSTRSUBSTR 简单字符串函数:

SELECT SUBSTR(column1, 1,      p1 - 1 ) || '~' ||
       SUBSTR(column1, p2 + 1, p3 - p2 - 1) || '~' ||
       SUBSTR(column1, p4 + 1, p5 - p4 - 1) AS column1_new
FROM   (
  SELECT column1,
         INSTR(column1, '~', 1, 1) AS p1,
         INSTR(column1, '~', 1, 2) AS p2,
         INSTR(column1, '~', 1, 3) AS p3,
         INSTR(column1, '~', 1, 4) AS p4,
         INSTR(column1, '~', 1, 5) AS p5
  FROM   table_name
);

其中,对于示例数据:

CREATE TABLE table_name (column1) AS
SELECT 'A~B~C~D~E~F' FROM DUAL;

输出:

COLUMN1_NEW
A~C~E

如果您想要更短的查询,那么您可以使用正则表达式:

SELECT REGEXP_REPLACE(column1, '([^~]+)~[^~]+~([^~]+)~[^~]+~([^~]+).*', '~~' )
         AS column1_new
FROM   table_name;

但是,你会发现性能很可能比简单的字符串函数差一个数量级。


另一种替代方法是生成实体化视图。

db<>fiddle here