如何从视图中的可为空列中驱动布尔字段? (SQL 服务器)

Posted

技术标签:

【中文标题】如何从视图中的可为空列中驱动布尔字段? (SQL 服务器)【英文标题】:How can I drive a boolean field off of a nullable column in a view? (SQL Server) 【发布时间】:2015-12-16 16:51:25 【问题描述】:

我在数据库中创建了一个视图。在这种情况下,Score 可以为空。

SELECT Student.Name, Score.Score
FROM Student JOIN Score ON Student.StudentID = Score.StudentID

现在,我想根据 Score 的值向此视图添加一个名为“IfScoreIsNull”的列。如果 Score 不为 NULL,则 IfScoreIsNull 将为 0。否则,将为 1。

基本上,我希望布尔字段由分数列是否为空来驱动。

完成此任务的最佳方法是什么?谢谢!

【问题讨论】:

【参考方案1】:

您可以使用CASE expression。这些非常适合有条件地返回数据。这是一个例子:

CASE WHEN Score.Score IS NULL THEN 1 ELSE 0 END AS IfScoreIsNull

这将是你的完整陈述:

SELECT 
    Student.Name, 
    Score.Score,
    CASE WHEN Score.Score IS NULL THEN 1 ELSE 0 END AS IfScoreIsNull
FROM 
    Student 
        INNER JOIN Score ON Student.StudentID = Score.StudentID
;

编辑:在我原来的答案中,我错误地将 case 表达式称为 case 语句。语句是更常见的形式。许多语言都有这些,他们习惯于control flow。在 SQL 中,我们有 case 表达式。它们返回一个基于布尔表达式的标量值。

【讨论】:

【参考方案2】:

您可以在Sql Server 2012+ 中执行此操作。使用IIF

select 
     IIF(Score.Score IS NULL,1,0) AS IfScoreIsNUll
     .....

【讨论】:

【参考方案3】:
SELECT 
    Student.Name, 
    Score.Score, 
    CASE WHEN Score.Score IS NULL THEN 1 ELSE 0 END AS IfScoreIsNUll
FROM Student JOIN Score ON Student.StudentID = Score.StudentID

【讨论】:

以上是关于如何从视图中的可为空列中驱动布尔字段? (SQL 服务器)的主要内容,如果未能解决你的问题,请参考以下文章

在 Virtuoso 中使用 Sql Workbench/J 导入具有空数字字段的 csv 文件

如何从大量可为空的布尔值中返回布尔值?

如何使用可为空的列连接 MySQL 表?

过度使用数据库中的可空列是“代码异味”吗?

SQL 在 Where 子句中处理可为空的外键

带值 SQL