首页 > 解决方案 > SQL Server 2016 AdventureWorks NULL 检查

问题描述

我正在处理两个不同的任务,我必须进行空值检查,但我不确定我是否正确编写了语法,因为我的导师还没有真正讨论过这个问题,但会为它做标记。

以下是2个问题和我写的内容。任何帮助表示赞赏。

作业 1 问题:为未在线订购且未使用信用卡订购的订单创建销售订单编号列表。注意:0 为假,1 为位字段真。下面是我使用的语法,我在这里做空检查吗?

SELECT SalesOrderNumber
FROM Sales.SalesOrder_json
WHERE OnlineOrderFlag = 0 AND CreditCardID IS NULL

作业 2 问题:列出没有产品的供应商。下面是我使用的语法,我在这里做空检查吗?

SELECT 
    pv.Name AS Vendors, 
    COUNT(PP.ProductID) AS 'Products'
FROM 
    Purchasing.Vendor AS PV
LEFT JOIN 
    Purchasing.ProductVendor AS PPV ON PV.BusinessEntityID = PPV.BusinessEntityID
LEFT JOIN 
    Production.Product AS PP ON PP.ProductID = PPV.ProductID 
GROUP BY 
    PV.Name
HAVING 
    COUNT(PP.ProductID)  = 0; 

标签: sqlsql-serversql-server-2016

解决方案


欢迎来到堆栈溢出!
将来,请发布摘要或创建代表查询中使用的表架构的表语句,以便我们有足够的信息来提供比推测性响应更多的信息。即使这是 Adventure Works DB,您也应该以良好的习惯开始您的 SO 之旅!

请尽量不要在网上直接发布作业问题,因为您很容易被大多数学术作业检查员完成抄袭,主要是因为其他学生可能会看到您的帖子,以及您从社区获得的支持,这可能会导致你们所有人都提交同样的结果。

你有没有运行你的查询?你认为结果正确吗?

如果您的查询结果是正确的,那么唯一的问题是“您是否进行了任何空值检查”?可以说,如果您的结果返回了正确的结果,那么您一定满足了标准,否则问题的表述就不是很好。

空检查可以概括为 3 种模式:

  1. 您在查询中使用IS NULLor直接与 null 进行比较IS NOT NULL

  2. 使用JOIN语法处理可能包含空值的数据。

    • INNER JOIN将结果限制为仅在两个表中匹配的记录。如果您需要省略null在外键字段中有 a 的记录,请使用此选项。
    • INNER加入,如LEFT JOIN. 这将从左表返回结果,即使在连接表或表中没有匹配的记录。
  3. 使用聚合函数,聚合通常会省略空值,如果所有值都是 ,则返回COUNT0 NULL,而其他聚合如SUM, MIN, MAX,如果所有值都是AVGNULLNULL

问题 1
显然,您已经实施了NULL检查,因为您已经直接在可为空的列上评估标准。

看起来您对问题 1 的回答非常好。

问题 2 虽然您的查询看起来会返回没有产品的供应商,但它也返回零计数。

您不需要输出列以便可以在过滤条件中使用它,因此COUNT(PP.ProductID) AS 'Products'请删除,除非另有指示使用它。

这是NULL支票吗?根据解释,我认为在这种情况下答案是肯定的。通过使用LEFT JOIN(或 OUTER 连接),您创建了一个结果集,该结果集的字段PP.ProductID值为NULLIf there are no products。

在该空列的筛选条件中使用 Count 并识别结果为零的 Count 意味着 ProductID 列实际上是空的,这意味着您已经评估了空检查。

还有其他方法可以查询相同的结果,例如使用 NOT EXISTS。NOT EXISTS不会是直接的空检查,因为 NULLABILITY 不是直接评估的。


推荐阅读