【问题标题】:SQL Server 2016 AdventureWorks NULL checksSQL Server 2016 AdventureWorks NULL 检查
【发布时间】:2019-04-11 22:10:48
【问题描述】:

我正在处理 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; 

【问题讨论】:

  • 建议对一些样本数据使用db-fiddle 并测试我们的解决方案。
  • 您有示例数据可以使用吗?作业 1 可能为真,但这取决于 CreditCard 列的外观。而对于作业 2,没有数据就无法判断
  • 在这个特定问题中,标题告诉我们正在使用 2016 年标准 AdventureWorks 数据库,这是提出通用 SQL 问题的公认标准,因为我们都可以访问该数据库。 OP 正在询问Have I checked for null,这是我们可以在不完全了解架构的情况下提供帮助的问题。

标签: sql sql-server sql-server-2016


【解决方案1】:

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

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

您是否运行过查询?你认为结果正确吗?

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

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

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

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

    • INNER JOIN 会将结果限制为仅在两个表中匹配的记录。如果您需要省略外键字段中包含 null 的记录,请使用此选项。
    • INNER 加入,如LEFT JOIN。这将返回左表的结果,即使在连接表或 表中没有匹配的记录。
  3. 使用聚合函数,聚合一般会省略空值,如果所有值都是NULLCOUNT将返回0,而其他聚合如SUMMINMAX,如果所有值都是NULLAVG 将返回 NULL

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

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

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

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

这是一个NULL 检查... 由解释,我认为在这种情况下答案是肯定的。通过使用 LEFT JOIN(或 OUTER 连接),您创建了一个结果集,如果没有产品,则该结果集将具有字段 PP.ProductID 的值为 NULL

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

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

【讨论】:

  • 在其他模式中,问题 1 有一个潜在的问题,如果 OnlineOrderFlag 字段可以为空,则应将其包装在 ISNULL 中:ISNULL(OnlineOrderingFlag,0) = 0 - 但这不适用于您的模式 :)
猜你喜欢
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-06
  • 1970-01-01
  • 1970-01-01
  • 2013-11-05
相关资源
最近更新 更多