You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL中如何比较CLOB列内的键值对并获取checklistVersion的新旧值

提取CLOB字段中JSON键值对的新旧值

由于你的CLOB列存储的是JSON格式数据,dbms_lob.compare只能对比整个CLOB内容是否一致,无法解析JSON结构提取特定字段。可以借助Oracle的JSON处理函数来实现需求:

1. 提取单条记录的checklistVersion值

通过json_value函数解析CLOB中的JSON数组,提取目标字段:

SELECT 
  json_value(c1, '$[0].checklistVersion' returning number) AS checklist_version
FROM t;

注:$[0]表示取JSON数组的第一个元素,若数组包含多个元素,可调整索引或使用json_table批量解析。

2. 获取新旧版本对比值

如果需要按记录顺序(这里用rowid临时生成顺序,建议表中存在主键/时间戳字段时替换为对应字段)对比相邻记录的版本,可结合窗口函数LAG实现:

WITH parsed_data AS (
  SELECT 
    json_value(c1, '$[0].checklistVersion' returning number) AS checklist_version,
    ROW_NUMBER() OVER (ORDER BY rowid) AS record_seq
  FROM t
)
SELECT 
  record_seq AS 记录顺序,
  checklist_version AS 当前版本,
  LAG(checklist_version) OVER (ORDER BY record_seq) AS 旧版本
FROM parsed_data;

3. 筛选版本变化的记录

若只需要找出版本发生变化的记录,可添加过滤条件:

WITH parsed_data AS (
  SELECT 
    json_value(c1, '$[0].checklistVersion' returning number) AS checklist_version,
    ROW_NUMBER() OVER (ORDER BY rowid) AS record_seq
  FROM t
)
SELECT 
  当前版本,
  旧版本
FROM (
  SELECT 
    checklist_version AS 当前版本,
    LAG(checklist_version) OVER (ORDER BY record_seq) AS 旧版本
  FROM parsed_data
)
WHERE 当前版本 != 旧版本
   OR (当前版本 IS NULL AND 旧版本 IS NOT NULL)
   OR (当前版本 IS NOT NULL AND 旧版本 IS NULL);

内容的提问来源于stack exchange,提问作者Riya Jain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 13:07:17