簡體   English   中英

拆分表的列值並跳過一些單詞

[英]split column value of a table and skip some words

希爾所有,

我有一張桌子,計數大約是200M。 它有一列包含用“~”分隔的數據。 我想解析它。

例如:

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

Result :
Column_new1
A~C~E

我只想跳過 2,4,6,n th。 字。 我不想要 plsql。 我需要 sql 查詢。 而且桌子很大,我也需要性能。

我使用 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, '([^~]+)~[^~]+~([^~]+)~[^~]+~([^~]+).*', '\1~\2~\3' )
         AS column1_new
FROM   table_name;

但是,您會發現性能可能比簡單的字符串函數差一個數量級。


另一種選擇是生成物化視圖。

db<> 在這里擺弄

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM