将 CLOB 列数据转换为 NUMBER 字段

Convert CLOB column data translated to NUMBER field

我正在使用 ORACLE SQL 开发人员。我有一个 table Clob_tab 列,其数据类型为:Col1 CLOB 该栏数据为('27,88,100,25,26')

我想将此列中的这个值用作另一个查询的子查询: select * 来自 Abc,其中 Col2 不在 (select 来自 Clob_tab 的 Col1); Col2 的数据类型是 NUMBER。 我想要输出为: select * 来自 Abc,其中 Col2 不在 (27,88,100,25,26) 中;

可能吗?

我试过很多东西都不起作用,比如: 将 blob 转换为 varchar2:dbms_lob.substr(MY_FIELD_BLOB_TYPE) 使用 regex_replace 将 varchar2 转换为数字: select cast(regexp_replace(Col1 , '[^0-9]+', '') as number) from Clob_tab 。 使用 regex_repalce 所有逗号都消失了,我得到 27881002526。我不想要这个数字。我想要用逗号分隔的数字。

None 个 gives/translates 我对这个表格的查询:

select * 来自 Abc,其中 Col2 不在 (27,88,100,25,26) 中;

我找到了解决这个问题的简单方法:)

select regexp_substr(OBJECT_NAME,'[^,]+', 1, level) 来自 prachi_exp_cycle 通过 regexp_substr(OBJECT_NAME, '[^,]+', 1, level) 不为空;

它将return 输出为comma-separated 字符值25、26、27。 当用作子查询时,这些输出将 auto-converted 到 SQL 开发人员中的编号。

有多种方法可以标记您的字符串;这使用正则表达式:

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

值得尝试各种方法并将性能与您的数据进行比较。