如何验证按行序列执行的数据迁移结果?CASE语句尝试未生效
校验查询实现
你可以通过窗口函数先按迁移规则计算出每个req_id对应的预期ncv1、ncv2值,再和已填充的字段值比对,即可完成校验,参考查询语句如下:
WITH req_map_sorted AS ( -- 按seq升序排列每个req_id的关联映射数据 SELECT req_id, nach_id, seq FROM dbo.req_map ORDER BY req_id, seq ASC ), expected_ncv1 AS ( -- 取每个req_id第一个nach_id作为预期ncv1 SELECT DISTINCT req_id, FIRST_VALUE(nach_id) OVER (PARTITION BY req_id ORDER BY seq ASC) AS expected_ncv1 FROM req_map_sorted ), expected_ncv2 AS ( -- 筛选出所有和ncv1不同的nach_id,取第一个作为预期ncv2 SELECT DISTINCT s.req_id, FIRST_VALUE(s.nach_id) OVER (PARTITION BY s.req_id ORDER BY s.seq ASC) AS expected_ncv2 FROM req_map_sorted s JOIN expected_ncv1 e1 ON s.req_id = e1.req_id WHERE s.nach_id != e1.expected_ncv1 ) -- 关联比对结果 SELECT cr.req_id, cr.ncv1, e1.expected_ncv1, cr.ncv2, ISNULL(e2.expected_ncv2, NULL) AS expected_ncv2, CASE WHEN cr.ncv1 = e1.expected_ncv1 AND ISNULL(cr.ncv2, -999) = ISNULL(e2.expected_ncv2, -999) THEN '校验通过' ELSE '校验失败' END AS 校验结果 FROM dbo.req cr JOIN expected_ncv1 e1 ON cr.req_id = e1.req_id LEFT JOIN expected_ncv2 e2 ON cr.req_id = e2.req_id
注意事项
你原查询中cr.ncv2 = null的写法是错误的,SQL中判断空值需要用IS NULL,= NULL永远返回未知结果,会导致判断逻辑失效。
按你提供的示例数据运行上述查询,会得到两个req_id的校验结果均为通过,符合迁移规则要求。
内容的提问来源于stack exchange,提问作者Richard Conaway
相关产品推荐
相关产品推荐

