在SQL Server中的三值逻辑示例
在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所关注的。
在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运算符进行判断。