как правильно разделить значение с разделителями табуляции на отдельные столбцы в ORACLE - PullRequest
1 голос
/ 22 марта 2019

Я работаю с этим запросом:

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 ]

4 голосов
/ 22 марта 2019

[^\t]+ будет соответствовать символам, которые не являются обратной косой чертой и не являются символом t.

Итак

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

Будет выводить:

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

Разделив строку на \ и t

Если вы хотите разделить ее на символ табуляции, то:

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

Что выводит:

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

дБ <> скрипка здесь

2 голосов
/ 22 марта 2019

Символы в квадратных скобках интерпретируются как буквенные символы , а не как экранирующие символы - поэтому вы соответствуете чему угодно, кроме '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       

A более безопасный шаблон :

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

дб <> скрипка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...