Если ваши значения CLOB больше 4000 байтов (а если нет, то почему они являются CLOB?), То это не идеально - возможны коллизии, если маловероятно, - но вы можете хешировать значения CLOB.
Если вы хотите посчитать количество различных значений:
select count(distinct dbms_crypto.hash(src=>mycol, typ=>2))
from mytable
where dbms_lob.instr(mycol,'value') > 0;
Если вы хотите посчитать, сколько раз появляется каждое отдельное значение:
select mycol, cnt
from (
select mycol,
count(*) over (partition by dbms_crypto.hash(src=>mycol, typ=>2)) as cnt,
row_number() over (partition by dbms_crypto.hash(src=>mycol, typ=>2) order by null) as rn
from mytable
where dbms_lob.instr(mycol,'value') > 0
)
where rn = 1;
Оба варианта могут быть довольно дорогими и медленными с большим количеством данных.
(typ=>2
дает числовое значение для dbms_crypto.hash_md5
, поскольку вы не можете ссылаться на константу пакета в вызове SQL, по крайней мере, до 12cR1 ...)
Скорее, грубее, но, возможно, значительно быстрее, вы можете основывать счет только на первых 4000 символах - что может или не может быть правдоподобно для ваших фактических данных:
select count(distinct dbms_lob.substr(mycol, 4000, 1))
from mytable
where dbms_lob.instr(mycol,'value') > 0;
select dbms_lob.substr(mycol, 4000, 1), count(*)
from mytable
where dbms_lob.instr(mycol,'value') > 0
group by dbms_lob.substr(mycol, 4000, 1);