今天遇到oracle 中clob 类型是无法进行group by的问题,但是有需要分组,在网上找了找,总结出两种解决办法
clob字段小于4000
clob字段无限制,但是比较麻烦,效率不敢保证
根据一下例子展示具体实现方式:
表 TEST 存在 两个字段 id varchar2(32) ,txt clob
第一种方式(txt小于4000 ):
SELECT to_char(txt),count(id) FROM TEST GROUP BY char(txt)
思路:将clob字段转为varchar
第二种方式:
WITH
b AS (
SELECT txt,ROWNUM AS groupNum
FROM (
SELECT
txt,
ROW_NUMBER() OVER ( PARTITION BY txt ORDER BY id DESC) AS RW
FROM TEST
)
WHERE RW = 1
)
SELECT b.txt,c.cnt
FROM (
SELECT COUNT(a.id) AS cnt,b.groupNum
FROM
TEST a,b
WHERE
a.txt = b.txt
GROUP BY b.groupNum
) c,b
WHERE
b.groupNum = c.groupNum
思路:
通过PARTITION BY对相同txt的值进行排序,然后选取第一条,即完成对txt的去重,并进行编号groupNum
每个不同的编号groupNum代表不同的txt,即实现以groupNum代替大字段txt
通过txt关联自身TEST,通过groupNum进行分组统计得到统计值cnt
以groupNum关联 b,得到统计值cnt与大字段txt的关系