拆分 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>
如果您追求性能,请使用 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, '([^~]+)~[^~]+~([^~]+)~[^~]+~([^~]+).*', '~~' )
AS column1_new
FROM table_name;
但是,你会发现性能很可能比简单的字符串函数差一个数量级。
另一种替代方法是生成实体化视图。
db<>fiddle here
希尔所有,
我有一个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>
如果您追求性能,请使用 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, '([^~]+)~[^~]+~([^~]+)~[^~]+~([^~]+).*', '~~' )
AS column1_new
FROM table_name;
但是,你会发现性能很可能比简单的字符串函数差一个数量级。
另一种替代方法是生成实体化视图。
db<>fiddle here