Ключ и значение тега с использованием регулярного выражения Teradata - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть набор данных TERADATA, который похож на приведенный ниже:

'Проект: Hercules IssueType: Компоненты улучшения: core AffectsVersions: 2.4.1 Приоритет: Незначительное время: 15:25:23 04/06 / 2020 '

Я хочу извлечь значение тега из приведенного выше на основе ключа.

Пример:

with comm as 
(
select  'Project: Hercules IssueType: Improvement Components: core AffectsVersions: 2.4.1 Priority: Minor' as text
)
select regexp_substr(comm.text,'[^: ]+',1,4)
 from comm where regexp_substr(comm.text,'[^: ]+',1,3) = 'IssueType';

Есть ли способ запроса без необходимость изменить аргументы позиции для каждого тега. Также я нахожу последнее поле немного сложным с полями даты и времени.

Любая помощь приветствуется.

Спасибо.

1 Ответ

1 голос
/ 07 апреля 2020

Существует функция NVP для доступа к данным пары имя / значение, но для разделения на несколько строк вам потребуется либо strtok_split_to_table, либо regexp_split_to_table. Сложной частью в вашем случае являются разделители, было бы проще, если бы они были уникальными вместо ' ' и ':':

WITH comm AS 
 (
   SELECT 1 as keycol, -- should be a key column in your table, either numeric or varchar
      'Project: Hercules IssueType: Improvement Components: core AffectsVersions: 2.4.1 Priority: Minor Time: 15:25:23 04/06/2020' AS text
 )
SELECT id, tokennum, token, 
   -- get the key
   StrTok(token,':', 1) AS "Key",
   -- get the value (can't use StrTok because of ':' delimiter)
   Substring(token From Position(': ' IN token)+2) AS "Value"
FROM TABLE
 ( RegExp_Split_To_Table(comm.keycol
                         ,comm.text
                         ,'( )(?=[^ ]+: )' -- assuming names don't contain spaces: split at the last space before ': '
                         , 'c') 
RETURNS (id INT , tokennum INTEGER, token VARCHAR(1000) CHARACTER SET Latin)) AS dt
...