首页/数据/数仓建模速查/SCD 属性比较的 NULL 安全写法
维度与事实设计149 条

SCD 属性比较的 NULL 安全写法

普通等值比较遇到 NULL 返回未知,属性含空值时变更检测会漏判;各引擎的 NULL 安全比较语法不一致,迁移时要复核。

数仓建模速查数据更新于 2026-10-12
MySQLa <=> b
PostgreSQLa IS NOT DISTINCT FROM b
Sparka <=> b 或 IS NOT DISTINCT FROM

差异检测

差异检测
-- 找出 name 或 phone 实际发生变化的当前行
SELECT d.customer_id
FROM dim_customer d JOIN stg_customer s USING (customer_id)
WHERE d.is_current = 1
  AND NOT (d.name <=> s.name OR (d.name IS NULL AND s.name IS NULL));
把 NULL 视为有效值时,先落默认值(如 '未知')再比较可简化逻辑,但要统一到维度规范里。

易错点

  • 直接用 <> 比较,NULL 行永远不判为变更
  • 不同引擎语义不同,跨引擎迁移后结果漂移

数据来源与参考

  • MySQL 8.0 参考手册:NULL 安全等值;Spark SQL 函数参考
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌