Функция Oracle для строкового токенайзера - PullRequest
0 голосов
/ 22 февраля 2019

Я новичок в Oracle PL / SQL.У меня есть требование, чтобы создать функцию для токенизации строки ниже

test|1$test2|4$test4|5$test9|3

в строки ниже

Key   value 
test    1
test2   4
test4   5
test9   3 

Спасибо

Ответы [ 2 ]

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

Используя функцию REPLACE, преобразуйте строки в XML, а затем уничтожьте XML.

with
  t as (
    select 'test|1$test2|4$test4|5$test9|3' as s from dual union all
    select 'foo|170$bar|42' from dual union all
    select 'test|1$test2|4$test4|5$test9|3' as s from dual union all
    select 'barr|420' from dual
  )
select
 x.*, t.*
from t,
xmltable(
  '//e'
  passing(xmltype('<t>'||
                  replace(replace('<e key="'||t.s||'"/>', '|', '" value="'),
                          '$', '"/><e key="')||'</t>'))
  columns "key" varchar2(30) path '@key',
          value number(10) path '@value'
) as x;

Вывод:

+-------+-------+--------------------------------+
|  key  | VALUE |               S                |
+-------+-------+--------------------------------+
| test  |     1 | test|1$test2|4$test4|5$test9|3 |
| test2 |     4 | test|1$test2|4$test4|5$test9|3 |
| test4 |     5 | test|1$test2|4$test4|5$test9|3 |
| test9 |     3 | test|1$test2|4$test4|5$test9|3 |
| foo   |   170 | foo|170$bar|42                 |
| bar   |    42 | foo|170$bar|42                 |
| test  |     1 | test|1$test2|4$test4|5$test9|3 |
| test2 |     4 | test|1$test2|4$test4|5$test9|3 |
| test4 |     5 | test|1$test2|4$test4|5$test9|3 |
| test9 |     3 | test|1$test2|4$test4|5$test9|3 |
| barr  |   420 | bar|420                        |
+-------+-------+--------------------------------+

DB <> FIDDLE .

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

Вам не нужна функция (PL / SQL), SQL может сделать это:

SQL> with
  2  -- input string
  3  test (col) as
  4    (select 'test|1$test2|4$test4|5$test9|3' from dual),
  5  -- intermediate CTE which creates rows
  6  inter as
  7    (select regexp_substr(col, '[^$]+', 1, level) val
  8     from test
  9     connect by level <= regexp_count(col, '\$') + 1
 10    )
 11  -- create two columns out of each substring
 12  select substr(val, 1, instr(val, '|') - 1) key,
 13         substr(val, instr(val, '|') + 1) value
 14  from inter;

KEY        VALUE
---------- ----------
test       1
test2      4
test4      5
test9      3

SQL>

Но, если должна быть функцией, она не должнаСлишком сложно преобразовать приведенный выше код в один.

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