希爾所有,
我有一個表,計數大約是 200M。它有一列包含由“~”分隔的資料。我想決議它。
例如:
Column1
A~B~C~D~E~F
Result :
Column_new1
A~C~E
我只想跳過第 2,4,6,n 個。字。我不想要 plsql。我需要 sql 查詢。而且桌子很大,我也需要性能。
我使用 substr,instr 函式,我可以決議。但是運行真的很慢..
感謝幫助。
uj5u.com熱心網友回復:
如果你是演出之后再使用INSTR和SUBSTR簡單的字串函式:
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<>在這里擺弄
uj5u.com熱心網友回復:
這是一個正則運算式選項。看起來不錯,不是 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>
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/371571.html
上一篇:沒有足夠的值選擇到表值中
