将 CLOB 列数据转换为 NUMBER 字段

问题描述 投票:0回答:3

我正在使用 ORACLE SQL Developer。我有一个表 Clob_tab,其数据类型为: Col1 CLOB 的列 这一列的数据是('27,88,100,25,26')

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

可以吗?

我尝试了多种不起作用的方法,例如: 将 blob 转换为 varchar2 : dbms_lob.substr(MY_FIELD_BLOB_TYPE) 使用 regex_replace 将 varchar2 转换为 Number:从 Clob_tab 选择cast(regexp_replace(Col1, '[^0-9]+', '') as number) 。 使用 regex_repalce 所有逗号都消失了,我得到 27881002526。我不想要这个数字。我想要数字用逗号分隔。

他们都没有将我的查询提供/翻译成这种形式:

从 Abc 中选择 *,其中 Col2 不在 (27,88,100,25,26) 中;

sql regex oracle-sqldeveloper clob
3个回答
0
投票

有多种方法可以对字符串进行分词;这使用正则表达式:

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<>小提琴

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


0
投票

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

select regexp_substr(OBJECT_NAME,'[^,]+', 1, level) from prachi_exp_cycle connect by regexp_substr(OBJECT_NAME, '[^,]+', 1, level) 不为空;

它将以逗号分隔的字符值 25,26,27 的形式返回输出。 当用作子查询时,这些输出将在 SQL Developer 中自动转换为数字。


0
投票

不要将

CLOB
拆分成值表;相反,您可以在
CLOB
中找到术语的子字符串匹配(匹配前后分隔符以确保匹配完整的术语):

SELECT *
FROM   Abc a
WHERE  EXISTS(
         SELECT 1
         FROM   clob_tab c
         WHERE  ',' || c.col1 || ',' LIKE '%,' || a.Col2 || ',%'
       )
© www.soinside.com 2019 - 2024. All rights reserved.