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

SQL查询问题:筛选NULL值却返回非NULL结果,WHERE子句排查求助

问题分析与修正方案

核心问题点

  1. 逻辑运算符优先级混乱:WHERE子句中的OR条件未用括号包裹,导致只要ATTR.AttributeName匹配三个值中的任意一个,就会绕过前面的ATTR.[Value]非空判断等约束,这是结果包含非NULL值的主要原因。
  2. NULL值判断语法错误:SQL中判断字段为NULL必须使用IS NULL,原语句中的ATTR.[Value] = 'NULL'是判断字段值等于字符串'NULL',而非真正的空值。
  3. 关联条件无效:最后一个LEFT JOIN的ON条件FI.InvoiceDateInt = CAL.DateInt与之前的关联重复,未关联产品维度表的核心字段,会产生冗余数据。

修正后的SQL语句

SELECT DISTINCT
    ATTR.ItemCode,
    ATTR.AttributeName,
    ATTR.[Group],
    ATTR.[Value],
    MFR.ManufacturerCode
FROM
    [CloudDWDB].[dbo].[Dimension_Product_Attributes_P360] ATTR WITH (NOLOCK)
LEFT JOIN 
    [CloudDWDB].[dbo].[Fact_Invoice] FI WITH (NOLOCK)
        ON ATTR.ItemCode = FI.ItemCode
INNER JOIN 
    [CloudDWDB].[dbo].[Dimension_CalendarDate] CAL WITH (NOLOCK)
        ON FI.InvoiceDateInt = CAL.DateInt
LEFT JOIN  
    [CloudDWDB].[dbo].[Dimension_Product_P360] MFR WITH (NOLOCK)
        ON ATTR.ItemCode = MFR.ItemCode  -- 修正关联条件,关联产品编码
WHERE
    ATTR.isActive = 1 
    AND ATTR.[Value] IS NULL  -- 修正NULL值判断
    AND FI.TransactionCode = 'IN'
    AND FI.SalesQuantity > 0 
    AND CAL.YearsAgo IN (0, 1, 2, 3) 
    AND FI.CompanyCode IN ('01', '02')
    AND (  -- 用括号包裹OR条件,保证逻辑优先级
        ATTR.AttributeName = 'Processor Number'
        OR ATTR.AttributeName = 'Platform Technology'
        OR ATTR.AttributeName = 'Processor Brand'
    )

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 19:36:05