我正在使用 OracleXE,我有一些文件名称中包含下划线或下划线字符 () _
。例子:
uno_dos_tres_cuatro.csv
A_B_C_D.csv
arbol_mesa_pizza_oregano.csv
我想将这些字段(不同长度)分成 4 个单独的列。
我使用了以下表达式,但该语句仅返回字符串中的第一个字段:
SELECT REGEXP_SUBSTR(NOMBRE_COMPLETO, '[^_]+[^_]+') FROM ARCHIVO;
我的想法是它返回 4 个字段,.csv
最后没有扩展名:
| columna 1 | columna 2 | columna 3 | columna 4 |
|-----------|-----------|-----------|-----------|
| uno | dos | tres | cuatro |
| A | B | C | D |
| arbol | mesa | pizza | oregano |
这是我的表的一个例子:
CREATE TABLE tabla ("id" int, "nombre_archivo" varchar2(34));
INSERT ALL
INTO tabla ("id", "nombre_archivo")
VALUES (1, 'uno_dos_tres_cuatro.csv')
INTO tabla ("id", "nombre_archivo")
VALUES (2, 'A_B_C_D.csv')
INTO tabla ("id", "nombre_archivo")
VALUES (3, 'arbol_mesa_pizza_oregano.csv')
SELECT * FROM dual;
分列(一般情况)
当分隔符是单个字符时,我们匹配除分隔符之外的任何文本
c
:示例
'_'
:而当我们在参数中传入 1 时
&num_item
,它将在分隔字符串时返回第一项;2 为第二个,以此类推。相反,如果分隔符有多个字符:
示例
'~~'
:最后
1
一个参数中的 表示返回与第一组括号匹配的文本。在这两种情况下,如果您想忽略空项目(连续两个分隔符),您必须将 更改
*
为 a+
。.csv
通过从末端移除来分开这个想法是匹配:
[^_]+
除下划线 ( )以外的所有字符(_|(\.csv)?$)
_
,或(\.csv)?$
文件扩展名(可选),后跟文本结尾。所以,我们有正则表达式:
我们有兴趣获得的是第一组的文本(第一组括号)。
我们将该正则表达式传递给REGEXP_SUBSTR()函数
num_coincidencia
我们将为 4 列中的每一列更改它。grupo
将为 1(匹配第一个括号的文本)代码:
结果
示范:
http://sqlfiddle.com/#!4/07d59/2/0