将 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
);
值得尝试各种方法并将性能与您的数据进行比较。
我正在使用 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
);
值得尝试各种方法并将性能与您的数据进行比较。