如何将制表符分隔的值正确拆分为ORACLE中的各个列

时间:2019-03-22 17:08:30

标签: sql oracle

我正在使用此查询:

SELECT
    REGEXP_SUBSTR ('test1   test2   test3', '[^\t]+', 1, 1) field1,
    REGEXP_SUBSTR ('test1   test2   test3', '[^\t]+', 1, 2) field2,
    REGEXP_SUBSTR ('test1   test2   test3', '[^\t]+', 1, 3) field3
FROM DUAL

我正在寻找具有每个值的每个字段。这是一个制表符分隔的字符串。但是我得到的是随机输出。

正在寻找:

field1    field2    field3
test1     test2     test3

获取:

field1    field2    field3
es        es        es

我想念什么?

谢谢

2 个答案:

答案 0 :(得分:4)

let obj1 = {}; let obj2 = []; console.log(obj1.length); // undefined: objects don't have length console.log(obj1.hasOwnProperty); // native function (ie. truthy) console.log(obj2.length); // 0: Arrays have length and this one's is 0 console.log(obj2.map); // the native function (ie. truthy)将匹配不是反斜杠也不是[^\t]+字符的字符。

所以

t

将输出:

FIELD1 | FIELD2 | FIELD3
:----- | :----- | :-----
aaa    | bbb    | ccc   

已在SELECT REGEXP_SUBSTR ('aaatbbb\ccc', '[^\t]+', 1, 1) field1, REGEXP_SUBSTR ('aaatbbb\ccc', '[^\t]+', 1, 2) field2, REGEXP_SUBSTR ('aaatbbb\ccc', '[^\t]+', 1, 3) field3 FROM DUAL \上拆分了字符串

如果要在制表符上拆分它,则:

t

哪个输出:

FIELD1 | FIELD2 | FIELD3
:----- | :----- | :-----
test1  | test2  | test3 

db <>提琴here

答案 1 :(得分:2)

方括号内的字符是interpreted as literal characters,而不是转义字符-因此,您要匹配't''\'以外的任何字符,而不是制表符。

您可以使用串联嵌入一个实际的制表符:

SELECT
    REGEXP_SUBSTR ('test1   test2   test3', '[^'||chr(9)||']+', 1, 1) field1,
    REGEXP_SUBSTR ('test1   test2   test3', '[^'||chr(9)||']+', 1, 2) field2,
    REGEXP_SUBSTR ('test1   test2   test3', '[^'||chr(9)||']+', 1, 3) field3
FROM DUAL;

FIELD FIELD FIELD
----- ----- -----
test1 test2 test3

尽管如此,您可能对相邻的标签有疑问:

SELECT
    REGEXP_SUBSTR ('test1       test3', '[^'||chr(9)||']+', 1, 1) field1,
    REGEXP_SUBSTR ('test1       test3', '[^'||chr(9)||']+', 1, 2) field2,
    REGEXP_SUBSTR ('test1       test3', '[^'||chr(9)||']+', 1, 3) field3
FROM DUAL;

FIELD FIELD FIELD3
----- ----- ------
test1 test3       

一个safer pattern是:

SELECT
    REGEXP_SUBSTR ('test1       test3', '(.*?)('||chr(9)||'|$)', 1, 1, null, 1) field1,
    REGEXP_SUBSTR ('test1       test3', '(.*?)('||chr(9)||'|$)', 1, 2, null, 1) field2,
    REGEXP_SUBSTR ('test1       test3', '(.*?)('||chr(9)||'|$)', 1, 3, null, 1) field3
FROM DUAL;

FIELD FIELD2 FIELD
----- ------ -----
test1        test3

db<>fiddle