我正在使用 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) 中;
有多种方法可以对字符串进行分词;这使用正则表达式:
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
);
尝试各种方法并将性能与数据进行比较是值得的。
我找到了解决这个问题的简单方法:)
select regexp_substr(OBJECT_NAME,'[^,]+', 1, level) from prachi_exp_cycle connect by regexp_substr(OBJECT_NAME, '[^,]+', 1, level) 不为空;
它将以逗号分隔的字符值 25,26,27 的形式返回输出。 当用作子查询时,这些输出将在 SQL Developer 中自动转换为数字。
不要将
CLOB
拆分成值表;相反,您可以在 CLOB
中找到术语的子字符串匹配(匹配前后分隔符以确保匹配完整的术语):
SELECT *
FROM Abc a
WHERE EXISTS(
SELECT 1
FROM clob_tab c
WHERE ',' || c.col1 || ',' LIKE '%,' || a.Col2 || ',%'
)