我正在try 创建一个视图,其中我希望一个列只能为true或false.然而,似乎无论我做什么,SQL Server(2008)都认为我的bit列可以以某种方式为空.

我有一个名为"Product"的表格,其中"Status"列为INT, NULL.在一个视图中,我想为Product中的每一行返回一行,如果Product.Status列等于3,否则位字段应为false.

示例SQL

SELECT CAST( CASE ISNULL(Status, 0)  
               WHEN 3 THEN 1  
               ELSE 0  
             END AS bit) AS HasStatus  
FROM dbo.Product  

如果我将此查询保存为视图,并查看对象资源管理器中的列,则HasStatus列将设置为BIT, NULL.但它永远不应该为空.有什么神奇的SQL技巧可以让我把这个专栏变成NOT NULL.

请注意,如果我删除CASE周围的CAST(),该列将正确设置为NOT NULL,但该列的类型将设置为INT,这不是我想要的.我希望是BIT.:-)

推荐答案

你可以通过重新安排你的查询来实现你想要的.诀窍在于,ISNULL必须在外部,SQL Server才能理解结果值永远不可能是NULL.

SELECT ISNULL(CAST(
    CASE Status
        WHEN 3 THEN 1  
        ELSE 0  
    END AS bit), 0) AS HasStatus  
FROM dbo.Product  

我发现这很有用的一个原因是,当使用ORM时,您不希望结果值映射到可为null的类型.如果应用程序认为该值永远不可能为空,那么它可以让事情变得更容易.这样就不必编写代码来处理空异常等.

Sql相关问答推荐

计算分段的总权重

分组多输出访问查询问题

当一个视图在Postgres中失效时?

连接三个表的正确方式是什么?在这三个表中,可以显示在一个表上的行将在其他表中显示结果

按连续相等值分组排序

Postgres SQL查询从字符串中获取邮箱地址

不存在记录的国外关键点

SQL中相同表内的VLOOKUP等价

显示所有组并计算给定组中的项目(包括 0 个结果)

对现有记录进行分组

SQL 查询是否返回列表中仅包含某些值而不包含其他值的行?

如何对 jsonb 中的字段执行求和,然后使用结果过滤查询的输出

每次计数器增加时通过运行总重置进行分组

计算 BigQuery 中列的中值差 - 分析函数不能作为聚合函数的参数

如何使用Informix创建一个临时表,将数据从根表导入并使用筛选条件

oracle中多行的跨日期范围的交集

检索具有相同位置的最小和最大store 数量

PostgresQL-根据另一列找到 3 个最低值

CURRENT_ROW 窗口框架上的 SQL 滞后

snowflake插入覆盖行为