Подключение по сценарию уровня в Db2

У меня есть сценарий в DB2, где у меня есть значение столбца как

Выберите значение из таблицы, где id='02346'

Ценить

1,2,3,4,5,6,7

Я хочу преобразовать это значение выше, как показано ниже, используя запрос DB2.

1 2 3 4 5 6 7

Как я могу этого добиться? я

Используя оракул, это делается, как показано ниже. с тестом как (выберите столбец «421907802490;421907672085;421911460415;421905464170;421907802292» из двойного) выберите результат regexp_substr(col, '[^;]+', 1, level) из теста соединить по уровню <= length(regexp_replace(col, '[^;]+')) + 1;

Ускорьте разработку веб-приложений Laravel с помощью этих бесплатных стартовых наборов
Ускорьте разработку веб-приложений Laravel с помощью этих бесплатных стартовых наборов
Laravel - это мощный PHP-фреймворк, используемый для создания масштабируемых и надежных веб-приложений. Одним из преимуществ Laravel является его...
Что такое двойные вопросительные знаки (??) в JavaScript?
Что такое двойные вопросительные знаки (??) в JavaScript?
Как безопасно обрабатывать неопределенные и нулевые значения в коде с помощью Nullish Coalescing
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание API-ресурса Laravel может быть непростой задачей. Она требует глубокого понимания возможностей Laravel и лучших практик, чтобы обеспечить...
Как сделать компонент справочного центра с помощью TailwindCSS
Как сделать компонент справочного центра с помощью TailwindCSS
Справочный центр - это веб-сайт, где клиенты могут найти ответы на свои вопросы и решения своих проблем. Созданный для решения многих распространенных...
Асинхронная передача данных с помощью sendBeacon в JavaScript
Асинхронная передача данных с помощью sendBeacon в JavaScript
В современных веб-приложениях отправка данных из JavaScript на стороне клиента на сервер является распространенной задачей. Одним из популярных...
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Отказ от ответственности: Эта статья предназначена только для демонстрации и не должна использоваться в качестве инвестиционного совета.
0
0
59
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Запустите его как есть.

select x.tok
from 
-- uncomment this and comment out "(values ...) t (id, value)"
-- table t
(
 values ('02346', '1,2,3,4,5,6,7')
) t (id, value)
, xmltable
(
  'for $id in tokenize($s, ",") return <i>{string($id)}</i>' 
  passing 
    t.value as "s"
  columns 
    tok varchar(4000) path '.'
) x
where t.id = '02346'

Обновление Если вы не находитесь в Db2 for LUW, вы можете использовать тот же подход RCTE:

with 
-- Uncomment to run as is
/*
mytab (id, value) as 
(
  select '02346', '1,2,3,4,5,6,7' from sysibm.sysdummy1
),
*/ 
cte (tok, value) as 
(
  select 
    substr (value, 1, coalesce (nullif (locate (',', value) - 1, -1), length (value)))
  , substr (value, nullif (locate (',', value) + 1, 1))
  from mytab
  where id = '02346' and length (value) <> 0
    union all 
  select 
    substr (value, 1, coalesce (nullif (locate (',', value) - 1, -1), length (value)))
  , substr (value, nullif (locate (',', value) + 1, 1))
  from cte
  where value is not null
)
select tok
from cte

Результат тот же:

ТОК 1 2 3 4 5 6 7

Рабочий пример

Это не работает в DB2 SQL. Ошибка SQL [42601]: НЕПРАВИЛЬНЫЙ СИМВОЛ "(". НЕКОТОРЫЕ СИМВОЛЫ, КОТОРЫЕ МОГУТ БЫТЬ ДОПУСТИМЫМИ:

sunny 10.01.2023 18:10

Какая у вас версия db2 и платформа?

Mark Barinstein 10.01.2023 20:14

Db2 v12 / мэйнфрейм z/os

sunny 11.01.2023 16:24

Обновленный запрос также не работал. Использование версии для мэйнфреймов db2 v12 / z/os. Я использую dbeaver в качестве клиента. Ошибка SQL [42601]: НЕПРАВИЛЬНЫЙ СИМВОЛ "MYTAB". НЕКОТОРЫЕ СИМВОЛЫ, КОТОРЫЕ МОГУТ БЫТЬ ЗАКОННЫМИ: DSN_INLINE_OPT_HINT. SQLCODE=-104, SQLSTATE=42601, ДРАЙВЕР=4.29.24

sunny 11.01.2023 16:37

Всегда указывайте свою платформу и версию Db2. zDb2 не поддерживает values .... Обновленный ответ должен работать на zDb2. Если вы не раскомментируете закомментированный блок, вы должны указать свою реальную таблицу вместо mytab, конечно.

Mark Barinstein 11.01.2023 17:24

Если вы работаете в LUW, используете относительно новую версию и можете включить режим совместимости с Oracle, ваш запрос будет работать сразу после установки. Пробовал с:

[db2inst1@db2server ~]$ db2set
DB2_COMPATIBILITY_VECTOR=ORA


[db2inst1@db2server ~]$ db2 "with test as (select '421907802490;421907672085;421911460415;421905464170;421907802292' col from dual) select regexp_substr(col, '[^;]+', 1, level) result from test connect by level <= length(regexp_replace(col, '[^;]+')) + 1"

RESULT                                                          
----------------------------------------------------------------
421907802490                                                    
421907672085                                                    
421911460415                                                    
421905464170                                                    
421907802292                                                    

  5 record(s) selected.

Протестировано с:

sudo docker pull ibmcom/db2
sudo docker run ...
sudo docker exec -it db2server bash
su - db2inst1

Другие вопросы по теме