Ren*_*ené 77 sql nullable sql-server-2008 sql-view
我正在尝试创建一个视图,我希望列只有真或假.但是,似乎无论我做什么,SQL Server(2008)都认为我的位列可能会以某种方式为空.
我有一个名为"Product"的表,其中包含"Status"列INT, NULL.在视图中,我想为Product中的每一行返回一行,如果Product.Status列等于3,则将BIT列设置为true,否则位字段应为false.
示例SQL
SELECT CAST( CASE ISNULL(Status, 0)
WHEN 3 THEN 1
ELSE 0
END AS bit) AS HasStatus
FROM dbo.Product
Run Code Online (Sandbox Code Playgroud)
如果我将此查询保存为视图并查看对象资源管理器中的列,则将HasStatus列设置为BIT, NULL.但它永远不应该是NULL.我可以使用一些神奇的SQL技巧来强制使用此列NOT NULL.
请注意,如果我删除了CAST()周围的CASE列,则列被正确设置为NOT NULL,但是列的类型设置为INT,这不是我想要的.我想要它BIT.:-)
Red*_*ter 140
您可以通过重新安排查询来实现您想要的功能.诀窍是,ISNULL在SQL Server理解结果值永远不会出现之前,必须在外部NULL.
SELECT ISNULL(CAST(
CASE Status
WHEN 3 THEN 1
ELSE 0
END AS bit), 0) AS HasStatus
FROM dbo.Product
Run Code Online (Sandbox Code Playgroud)
我实际上发现这个有用的一个原因是在使用ORM时你不希望结果值映射到可空类型.如果您的应用程序将值视为永远不为空,那么它可以使事情变得更容易.然后,您不必编写代码来处理null异常等.
仅供参考,对于遇到此消息的人,在转换/转换外部添加 ISNULL() 可能会扰乱视图上的优化器。
我们有两个表使用相同的值作为索引键,但具有不同数值精度的类型(我知道这很糟糕),我们的视图正在连接它们以产生最终结果。但是我们的中间件代码正在寻找特定的数据类型,并且视图在返回的列周围有一个 CONVERT()
我注意到,正如OP所做的那样,视图结果的列描述符将其定义为可为空,我认为这是两个表上的主/外键;为什么我们希望结果定义为可为空?
我找到了这篇文章,在列周围扔了 ISNULL() ,瞧——不再可以为空了。
问题是,当对该列进行查询过滤时,视图的性能直接下降。
由于某种原因,视图结果列上的显式 CONVERT() 并没有搞砸优化器(由于精度不同,无论如何它都必须这样做),但是添加一个冗余的 ISNULL() 包装器确实会搞砸,在一个大的情况下方式。
| 归档时间: |
|
| 查看次数: |
50382 次 |
| 最近记录: |