Teradata SQL - найти значения между каждым тегом из строки / столбца - PullRequest
0 голосов
/ 14 декабря 2018

Я хочу извлечь значения между тегами и создать новые столбцы из этого.

например, мой столбец (который является varchar) получил следующее значение:

Working : History 0 : <Site Details.Number of Complaints>WAS<>IS<3>

Мне нужно извлечь из этого 3 столбца: 1. Сведения о сайте. Количество жалоб 2. Пусто (пусто)3. 3

, поскольку три значения заключены между открывающим тегом ('>') и закрывающим тегом ('<').</p>

Я уже пытался использовать regex_substr и strtok, но я не могу извлечь второе значение как ноль.

Запрос пока:

select  STRTOK(STRTOK('Working : History 0 : <Site Details.Number of Complaints>WAS<>IS<3>','<',1),'>',1) col_a,
        STRTOK(STRTOK('Working : History 0 : <Site Details.Number of Complaints>WAS<>IS<3>','<',2) ,'>',1)col_b,
        STRTOK(STRTOK('Working : History 0 : <Site Details.Number of Complaints>WAS<>IS<3>','<',3) ,'>',1)col_c,
        STRTOK(STRTOK('Working : History 0 : <Site Details.Number of Complaints>WAS<>IS<3>','<',4) ,'>',1)col_d

Вывод:

    col_a   col_b   col_c   col_d
1   Working : History 0 :   Site Details.Number of Complaints   IS  3

К вашему сведению - в каждом столбце будет 3 открывающих и закрывающих тегаМне нужен терадата SQL для того же.

1 Ответ

0 голосов
/ 14 декабря 2018

Как вы заметили, STRTOK не может быть использовано для этого, это для токенизации строк с очень простыми правилами.

Вам нужен RegEx:

SELECT  
    RegExp_Substr(col, '<\K.*?(?=>)',1,1)
   ,RegExp_Substr(col, '<\K.*?(?=>)',1,2)
   ,RegExp_Substr(col, '<\K.*?(?=>)',1,3)
   ,'Working : History 0 : <Site Details.Number of Complaints>WAS<>IS<3>' AS col

<\K.*?(?=>)
<\K          = check for '<', but don't add it to the result (similar to a positive lookbehind, which will not work in this case)
   .*?       = any characters, i.e. the expected result
      (?=>)  = check for '>' without adding it to the result, i.e. positive lookahead

См. RegEx101 для деталей.

...