在SQL Server中的三值逻辑示例

25 浏览
0 Comments

在SQL Server中的三值逻辑示例

我知道SQL使用三值逻辑,但我在实践中使用它时遇到了困难,尤其是为什么TRUE || NULL = TrueFALSE && NULL = False而不是评估为null。\n下面是适用于SQL Server的三值真值表:\n\"Tri\n我在网上找到了一些关于三值逻辑的解释,但是我找不到任何实际的代码示例来说明这个问题。有人可以给我展示一个使用三值逻辑的代码示例,帮助我更好地理解吗?

0
0 Comments

在SQL Server中的三值逻辑示例

在用户的角度来看,布尔表达式不应该评估为NULL。编写SQL通常涉及编写查询来显式避免在布尔表达式中出现NULL值。在我的经验中,开发人员故意使用三值逻辑将被视为滥用三值逻辑。一个正确编写的查询应该处理NULL并理解它们,而不是写成在某些情况下当某些值为NULL时它们偶然工作正常。通常,这涉及到在某处使用COALESCE()、IS NULL或IS NOT NULL。

然而,理解逻辑是至关重要的,因为NULL存在并且对于大多数现实世界的数据是不可避免的。

例如,假设我正在处理一个学生表。该表具有名、中间名和姓字段。我想知道没有中间名的学生列表。现在,一些应用程序将存储一个空字符串'',一些应用程序将存储NULL值,还有一些应用程序可能两者都会(而一些RDBMS(如Oracle)将空字符串视为NULL)。如果您不确定,您可以这样写:

SELECT *
FROM Student
WHERE MiddleName = ''
    OR MiddleName IS NULL;

另一种常见情况是当您与另一个表进行外连接时。假设您正在比较教师的工资支票。您有一个Checks表和一个CheckDetail表。您想知道教师为福利支付了多少。您的报告需要列出所有教师,即使他们是承包商,也不需要支付福利,因为他们没有获得任何福利:

SELECT Check.Employee_Id,
    SUM(CheckDetail.Amount) AS BenefitsDeductions
FROM Check
LEFT JOIN CheckDetail
    ON  Check.Id = CheckDetail.CheckId
    AND CheckDetail.LineItemType = 'Benefits'
GROUP BY Check.Employee_Id;

运行报告后,您注意到您的承包教师的BenefitsDeductions显示为NULL。糟糕。您需要确保它显示为零:

SELECT Check.Employee_Id,
    COALESCE(SUM(CheckDetail.Amount),0) AS BenefitsDeductions
FROM Check
LEFT JOIN CheckDetail
    ON  Check.Id = CheckDetail.CheckId
    AND CheckDetail.LineItemType = 'Benefits'
GROUP BY Check.Employee_Id;

所以你尝试了一下,它起作用了。没有NULL值!但是...几天后,用户报告说,即使他们现在支付福利,以前是承包商的教师也显示为0。您必须在求和之前使用COALESCE来保持这些金额:

SELECT Check.Employee_Id,
    SUM(COALESCE(CheckDetail.Amount,0)) AS BenefitsDeductions
FROM Check
LEFT JOIN CheckDetail
    ON  Check.Id = CheckDetail.CheckId
    AND CheckDetail.LineItemType = 'Benefits'
GROUP BY Check.Employee_Id;

发现这些类型的边界情况和异常正是编写SQL所关注的。

0
0 Comments

在SQL Server中,存在三值逻辑的问题。这个问题的出现是因为当在布尔表达式中评估NULL时,它既不是True也不是False,而是NULL。具体是将其评估为True、False还是Error取决于系统在将NULL作为布尔值进行评估时的行为。

为了解决这个问题,SQL Server会尽可能避免选择NULL的结果。当被强制进行评估时,很少会得到一个正面(True)的结果。

0
0 Comments

在SQL Server中,存在三值逻辑的例子。这种逻辑是指在布尔运算中,除了真(true)和假(false)之外,还存在第三个值,即未知(null)。

下面给出了一个例子:TRUE || NULL = True。具体代码如下:

declare @result as int = null;
if 1=1 or @result=1
    print 'true'

在这个例子中,变量`@result`被赋值为null。根据三值逻辑的规则,当一个布尔值与null进行或运算时,结果为true。因此,无论另一个条件是否为真,整个条件表达式的结果都是true。

另一个例子是:FALSE && NULL = False。具体代码如下:

declare @result as int = null;
if not(1=2 and @result=1)
    print 'false'

在这个例子中,变量`@result`同样被赋值为null。根据三值逻辑的规则,当一个布尔值与null进行与运算时,结果为false。因此,无论另一个条件是否为真,整个条件表达式的结果都是false。

这种三值逻辑在SQL Server中的出现是因为在数据库中,存在着空值(null)的概念。空值表示缺少值或未知值,因此对于空值的布尔运算的结果是未知的。为了处理这种情况,SQL Server引入了三值逻辑。

要解决这种情况,我们可以使用IS NULL和IS NOT NULL运算符来判断一个值是否为null。例如:

declare @result as int = null;
if @result is null
    print 'result is null'

在这个例子中,我们使用IS NULL运算符来检查变量`@result`是否为null。如果是null,就会输出'result is null'。

,SQL Server中的三值逻辑是为了处理空值的情况。当进行布尔运算时,要注意空值的情况,并使用IS NULL和IS NOT NULL运算符进行判断。

0