我有一个有两列的表:
OLD_REVISIONS |NEW_REVISIONS ----------------------------------- 1,25,26,24 |1,24,25 1,56,55,54 |1,54 1 |1 1,2 |1 1,96,95,94 |1,94,95 1 |1 1 |1 1 |1 1 |1 1,2 |1,2 1 |1 1 |1 1 |1 1 |1
>对于每一行,都会有一个文档修订列表(以逗号分隔)
>逗号分隔列表在两列中可能相同但订单/排序可能不同 – 例如
2,1 | 1,2
我想找到OLD_REVISIONS列中最高版本低于NEW_REVISIONS中最高版本的所有实例
以下符合该标准
OLD_REVISIONS |NEW_REVISIONS ----------------------------------- 1,54
>我尝试使用MINUS选项的解决方案(将表连接到自身),但即使列表相同但顺序错误,它也会返回差异
>我尝试了GREATEST函数(即最大(new_Revisions)< great(old_revisions)),但我不确定为什么最大(OLD_REVISIONS)总是只返回逗号分隔值.它不返回最大值.我怀疑它是在比较字符串,因为列是VARCHAR.
此外,MAX功能需要一个数字.
还有另一种方法可以实现上述目标吗?我正在寻找一个纯sql选项,所以我可以打印出结果(或者可以打印出结果的PL / sql选项)
编辑
抱歉没有提到这个但是对于NEW_REVISIONS我确实在表中有数据,其中每个修订都在一个单独的行中:
"DOCNUMBER" "REVISIONNUMBER" 67 1 67 24 67 25 67 26 75 1 75 54 75 55 75 56 78 1 79 1 79 2 83 1 83 96 83 94
只是为了给出一些内容,几周前我怀疑有修改消失了.
为了对此进行调查,我决定对所有文档的所有修订进行计数,然后拍摄快照以便稍后进行比较,看看是否确实缺少修订.
我拍摄的快照包含以下列:
docnn,count,revisions
使用listagg函数将修订存储在逗号分隔的列表中.
我现在遇到的麻烦是现场表,新版本已经添加,所以当我使用MINUS比较主表和快照时,我会有所不同,因为
主表中的新修订版.
即使在实际表中,修订是单独的行,在快照表中我没有单独的行.
我想的是以相同格式重新创建快照的唯一方法,并比较它们发现主表中的最大修订是否低于快照表中的最大修订版(因此我试图找出如何找出最大值在逗号分隔的字符串中)
解决方法
请享用.
select xmlcast(xmlquery(('max((' || OLD_REVISIONS || '))') RETURNING CONTENT) as int) as OLD_REVISIONS_max,xmlcast(xmlquery(('max((' || NEW_REVISIONS || '))') RETURNING CONTENT) as int) as NEW_REVISIONS_max from t ;