SQL-запрос для разделения канала с пустыми значениями - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть таблица, которая называется содержимым:

create table contents(file_name varchar2(4000), file_content clob);

Вот таблица:

file_name                                  file_content
deID.RESUL_12433287659.txt_234323456.txt   |678976|TEST|TBDKK|7865679809
deID.RESUL_34534563649.txt_345353567.txt   1|678977||TB5KK|7866709
deID.RESUL_44235345636.txt_537967875.txt   |678978|TE2T|TB4KK|78669809
deID.RESUL_35234663456.txt_423452545.txt   4|678979|TE3T|T3DKK|785679809

Мне нужно создать другую таблицу с именем data_contents, используя содержимое со следующей структурой:

file_name                                  id  number   name  address  phone
deID.RESUL_12433287659.txt_234323456.txt       678976   TEST  TBDKK    7865679809
deID.RESUL_34534563649.txt_345353567.txt    1  678977         TB5KK    7866709
deID.RESUL_44235345636.txt_537967875.txt       678978   TE2T  TB4KK    78669809
deID.RESUL_35234663456.txt_423452545.txt    4  678979   TE3T  T3DKK    785679809

Я пытался с этим запросом:

with DTE as
(
    select file_name, 
           to_char(file_content) as file_content -- preconvert the clob to a varchar
    from MyTable
)
, CTE as
(
    select file_name, 
           case 
             when substr(file_content,1,1) ='|' -- If the string starts with the delimiter
               then ' '||file_content -- then add a space at the start
             else file_content 
           end as file_content
    from DTE
)

    select file_name,
           regexp_substr (file_content, '[^|]+',1, 1 ) as id,
           regexp_substr (file_content, '[^|]+',1, 2 ) as thenumber, 
           regexp_substr (file_content, '[^|]+',1, 3 ) as thename,
           regexp_substr (file_content, '[^|]+',1, 4 ) as theaddress,
           regexp_substr (file_content, '[^|]+',1, 5) as phone
    from CTE

Если есть какое-либо поле, которое является пустым, например.вторая строка, где имя не существует, затем игнорируется моим запросом и из-за этого все значения столбца сдвигаются на одну ячейку.

Есть ли в любом случае значение NULL, если в каком-либо столбце нет значений?

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

Я использовал немного другой шаблон, который соответствует боту трубы и тому, что находится перед трубой (или после последнего значения)

SELECT file_name,
   regexp_substr(file_content, '([A-Z0-9]*)(\|)',1,1,'',1) as id,
   regexp_substr(file_content, '([A-Z0-9]*)(\|)',1,2,'',1) as thenumber,
   regexp_substr(file_content, '([A-Z0-9]*)(\|)',1,3,'',1) as thename,
    regexp_substr(file_content, '([A-Z0-9]*)(\|)',1,4,'',1) as theaddress,
   regexp_substr(file_content, '(\|)([A-Z0-9]*)$',1,1,'',2) as phone
FROM CTE
0 голосов
/ 21 февраля 2019

Вы можете сделать это следующим образом:

with DTE as
(
  SELECT 'deID.RESUL_12433287659.txt_234323456.txt' file_name, '|678976|TEST|TBDKK|7865679809' file_content FROM dual UNION ALL
  SELECT 'deID.RESUL_34534563649.txt_345353567.txt' file_name, '1|678977||TB5KK|7866709' file_content FROM dual UNION ALL
  SELECT 'deID.RESUL_44235345636.txt_537967875.txt' file_name, '|678978|TE2T|TB4KK|78669809' file_content FROM dual UNION ALL
  SELECT 'deID.RESUL_35234663456.txt_423452545.txt' file_name, '4|678979|TE3T|T3DKK|785679809' file_content FROM dual
)
SELECT file_name,
       file_content,
       REGEXP_SUBSTR(file_content, '(.*?)(\||$)', 1, 1, NULL, 1) ID,
       REGEXP_SUBSTR(file_content, '(.*?)(\||$)', 1, 2, NULL, 1) thenumber,
       REGEXP_SUBSTR(file_content, '(.*?)(\||$)', 1, 3, NULL, 1) thename,
       REGEXP_SUBSTR(file_content, '(.*?)(\||$)', 1, 4, NULL, 1) theaddress,
       REGEXP_SUBSTR(file_content, '(.*?)(\||$)', 1, 5, NULL, 1) phone
FROM   dte;

FILE_NAME                                FILE_CONTENT                  ID THENUMBER THENAME THEADDRESS PHONE
---------------------------------------- ----------------------------- -- --------- ------- ---------- ------------
deID.RESUL_12433287659.txt_234323456.txt |678976|TEST|TBDKK|7865679809    678976    TEST    TBDKK      7865679809
deID.RESUL_34534563649.txt_345353567.txt 1|678977||TB5KK|7866709       1  678977            TB5KK      7866709
deID.RESUL_44235345636.txt_537967875.txt |678978|TE2T|TB4KK|78669809      678978    TE2T    TB4KK      78669809
deID.RESUL_35234663456.txt_423452545.txt 4|678979|TE3T|T3DKK|785679809 4  678979    TE3T    T3DKK      785679809

(я заменил ваш DTE на подзапрос, имитирующий данные в вашей таблице; вы бы использовали тот же DTE, который у вас уже был.)

Это работает путем сопоставления 0 или более символов, за которыми следует либо разделитель | (который мы должны экранировать, поскольку это специальный символ в регулярных выражениях), либо конец строки.

Тогдамы находим n-е вхождение, в зависимости от того, какой столбец мы ищем.

Наконец, нам нужен последний параметр, чтобы ограничить возвращаемое значение значениями в первом наборе скобок (т. е. текстом, определенным .*?), иначе вы получите значения с добавленным |, а не только со значением.

0 голосов
/ 21 февраля 2019

Вы можете просто заменить все '|'на '|', поэтому нулевые значения учитываются, а затем удаляются все лишние пробелы:

    with DTE as
(
    select file_name, 
           replace(to_char(file_content), '|', ' |') as file_content -- preconvert the clob to a varchar
    from MyTable
)
    select file_name,
           replace(regexp_substr (file_content, '[^|]+',1, 1 ), ' ', '') as id,
           replace(regexp_substr (file_content, '[^|]+',1, 2 ), ' ', '') as thenumber, 
           replace(regexp_substr (file_content, '[^|]+',1, 3 ), ' ', '') as thename,
           replace(regexp_substr (file_content, '[^|]+',1, 4 ), ' ', '') as theaddress,
           replace(regexp_substr (file_content, '[^|]+',1, 5), ' ', '') as phone
    from DTE;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...