Преобразовать данные столбца CLOB, переведенные в числовое поле - PullRequest
0 голосов
/ 05 августа 2020

Я использую ORACLE SQL Developer. У меня есть таблица Clob_tab с столбцом с типом данных: Col1 Данные CLOB в этом столбце: ('27, 88,100,25,26 ')

Я хочу использовать это значение из этого столбца как подзапрос в другой запрос : выберите * из Ab c, где Col2 отсутствует (выберите Col1 из Clob_tab); ДАТАТИП столбца 2 - НОМЕР. Мне нужен вывод как: select * from Ab c, где Col2 отсутствует (27,88,100,25,26);

Возможно ли это?

Я пробовал несколько вещей, которые не являются работает как: Преобразование blob в varchar2: dbms_lob.substr (MY_FIELD_BLOB_TYPE) Преобразование varchar2 в Number с помощью regex_replace: выберите cast (regexp_replace (Col1, '[^ 0-9] +', '') as number) из Clob_tab. Используя regex_repalce, все запятые исчезают, и я получаю 27881002526. Мне не нужен этот номер. Я хочу, чтобы числа были разделены запятыми.

Ни один из них не дает / не переводит мой запрос в эту форму:

select * from Ab c, где Col2 отсутствует в (27,88,100,25, 26);

Ответы [ 2 ]

0 голосов
/ 05 августа 2020

Существуют различные способы токенизировать вашу строку; здесь используются регулярные выражения:

with cte (n) as (
  select to_number(regexp_substr(col1, '(.*?)(,|$)', 1, level, null, 1))
  from clob_tab
  connect by level < regexp_count(col1, '(.*?)(,|$)')
)
select *
from abc
where col2 not in (
  select n from cte
);

Здесь используется XMLTable для обработки значений как последовательности и их извлечения:

select *
from abc
where col2 not in (
  select to_number(x.column_value)
  from clob_tab
  cross join xmltable (col1) x
);

В зависимости от вашей версии Oracle вы, вероятно, могли бы сделать что-то подобное с JSON вместо XML:

select *
from abc
where col2 not in (
  select x.n
  from clob_tab
  cross join json_table (json_array(col1 format json), '$[*]' columns n number path '$') x
);

db <> fiddle

Стоит попробовать различные подходы и сравнить производительность с вашими данными.

0 голосов
/ 05 августа 2020

Я нашел простое решение этой проблемы :)

выберите regexp_substr (OBJECT_NAME, '[^,] +', 1, level) из prachi_exp_cycle подключиться с помощью regexp_substr (OBJECT_NAME, '[^,] + ', 1, level) не равно NULL;

Он вернет результат в виде значений char, разделенных запятыми 25,26,27. Эти выходные данные будут автоматически преобразованы в число в SQL разработчике при использовании в качестве подзапроса.

...