急问表达式中有字段为null的问题!

soddy 2003-10-09 11:16:35
比如执行select (a+b)/(c+d+e+f) as exp1 from table1 这条语句,
如果d字段全为null的话,则算出来都为null,现在需要的是,忽略d,把
它当作0 来处理,让公式能算出来值来,请问怎么做?赐教。急需解答。
...全文
61 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
soddy 2003-10-09
  • 打赏
  • 举报
回复
而且在执行select sum(a) from b中,如果a字段某一行为空,能不能将其忽略?仍然能够求出和来?
soddy 2003-10-09
  • 打赏
  • 举报
回复
现在的问题是,那个字段为null是不确定的。所以select (a+b)/(c+isnull(d, 0)+e+f) as exp1 from table1好象不具有普遍解决性。
pengdali 2003-10-09
  • 打赏
  • 举报
回复
select (isnull(a,0)+isnull(b,0))/(isnull(c,0)+isnull(d,0)+isnull(e,0)+isnull(f,0)) as exp1 from table1
soddy 2003-10-09
  • 打赏
  • 举报
回复
没发现解决方法呀。
zarge 2003-10-09
  • 打赏
  • 举报
回复
用isnull()函数

select (a+b)/(c+isnull(d, 0)+e+f) as exp1 from table1
zhaoloudy 2003-10-09
  • 打赏
  • 举报
回复
ANSI_NULLS

当设置为 ON 时,所有与空值比较的值都取值为 NULL(未知)。当设置为 OFF 时,如果两个值都为 NULL,则非 Unicode 值与空值比较的值都取值为 TRUE。默认情况下,ANSI_NULLS 数据库选项为 OFF。

连接级设置(使用 SET 语句设置)替代 ANSI_NULLS的默认数据库设置。默认情况下,当连接到 SQL Server 时,ODBC 和 OLE DB 客户端发出连接级 SET 语句,将会话的 ANSI_NULLS 设置为 ON。有关更多信息,请参见 SET ANSI_NULLS。

在计算列或索引视图上创建或操作索引时,SET ANSI_NULLS 也必须为 ON。

此选项的状态可通过检查 DATABASEPROPERTYEX 函数的 IsAnsiNullsEnabled 属性来确定。



ANSI_WARNINGS

当设置为 ON 时,在出现如"被零除"或聚合函数中出现空值这类情形时,将发出错误或警告。当设置为 OFF 时,聚合函数中出现空值时不会发出警告,而在出现"被零除"这类情形时将返回空值。默认情况下,ANSI_WARNINGS 为 OFF。

在计算列或索引视图上创建或操作索引时,SET ANSI_WARNINGS 必须设置为 ON。

连接级设置(使用 SET 语句设置)替代 ANSI_WARNINGS 的默认数据库设置。默认情况下,当连接到 SQL Server 时,ODBC 和 OLE DB 客户端发出连接级 SET 语句,将会话的 ANSI_WARNINGS 设置为 ON。有关更多信息,请参见 SET ANSI_WARNINGS。

此选项的状态可通过检查 DATABASEPROPERTYEX 函数的 IsAnsiWarningsEnabled 属性来确定。


指定在对空值使用等于 (=) 和不等于 (<>) 比较运算符时,这些运算符的 SQL-92 遵从行为。

语法
SET ANSI_NULLS {ON | OFF}

注释
SQL-92 标准要求对空值的等于 (=) 或不等于 (<>) 比较取值为 FALSE。当 SET ANSI_NULLS 为 ON 时,即使 column_name 中存在空值,使用 WHERE column_name = NULL 的 SELECT 语句仍返回零行。即使 column_name 中存在非空值,使用 WHERE column_name <> NULL 的 SELECT 语句仍返回零行。

当 SET ANSI_NULLS 为 OFF 时,等于 (=) 和不等于 (<>) 比较运算符不遵从 SQL-92 标准。使用 WHERE column_name = NULL 的 SELECT 语句返回 column_name 中含有空值的行。使用 WHERE column_name <> NULL 的 SELECT 语句返回列中含有非空值的行。此外,使用 WHERE column_name <> XYZ_value 的 SELECT 语句返回所有非 XYZ 值和非 NULL的行。



说明 Microsoft® SQL Server™ 是将空字符串解释为单个空格还是真正的空字符串,取决于 sp_dbcmptlevel 的兼容级别设置。如果兼容级别小于或等于 65,SQL Server 就将空字符串解释为单个空格。如果兼容级别等于 70,则 SQL Server 将空字符串解释为空字符串。有关更多信息,请参见 sp_dbcmptlevel。


当 SET ANSI_NULLS 为 ON 时,所有对空值的比较均取值为 UNKNOWN。当 SET ANSI_NULLS 为 OFF 时,如果数据值是 NULL,则所有数据对空值的比较将取值为 TRUE。如果未指定,则应用当前数据库的 ANSI nulls 选项的设置。有关 ANSI nulls 数据库选项的更多信息,请参见 sp_dboption 和设置数据库选项。

为使脚本按预期运行,不管 ANSI nulls 数据库选项或 SET ANSI_NULLS 的设置是什么,在可能包含空值的比较中使用 IS NULL 和 IS NOT NULL。

对于存储过程,SQL Server 使用最初创建存储过程时的 SET ANSI_NULLS 设置值。无论随后何时执行存储过程,SET ANSI_NULLS 的设置都还原为其最初使用的值并生效。当在存储过程内唤醒调用 SET ANSI_NULLS 时,其设置不更改。

在执行分布式查询时应将 SET ANSI_NULLS 设置为 ON。

在计算列或索引视图上创建或操作索引时,SET ANSI_NULLS 也必须为 ON。如果 SET ANSI_NULLS 为 OFF,计算列或索引视图上带索引的表上的 CREATE、UPDATE、INSERT 和 DELETE 语句将失败。SQL Server 将返回一个错误,列出所有违反所需值的 SET 选项。另外,在执行 SELECT 语句时,如果 SET ANSI_NULLS 为 OFF,则 SQL Server 将忽略计算列或视图上的索引值并解析选择,就好象表或视图上没有这样的索引一样。



说明 ANSI_NULLS 是在处理计算列或索引视图上的索引时必须设置为所需值的七个 SET 选项之一。还必须将选项 ANSI_PADDING、ANSI_WARNINGS、ARITHABORT、QUOTED_IDENTIFIER 和 CONCAT_NULL_YIELDS_NULL 设置为 ON,而必须将 NUMERIC_ROUNDABORT 设置为 OFF。


SQL Server ODBC 驱动程序和用于 SQL Server 的 Microsoft OLE DB 提供程序在连接时自动将 ANSI_NULLS 设置为 ON。该设置可以在 ODBC 数据源、ODBC 连接特性或 OLE DB 连接属性(它们在连接到 SQL Server 之前在应用程序中设置)中进行配置。对来自 DB-Library 应用程序的连接,SET ANSI_NULLS 默认为 OFF。

当 SET ANSI_DEFAULTS 为 ON 时,将启用 SET ANSI_NULLS。

SET ANSI_NULLS 的设置是在执行或运行时设置,而不是在分析时设置。

权限
SET ANSI_NULLS 权限默认授予所有用户。

示例
下例使用等于 (=) 和不等于 (<>) 比较运算符对表中的 NULL 值和非空值进行比较。下例还显示 IS NULL 不受 SET ANSI_NULLS 设置的影响。

-- Create table t1 and insert values.
CREATE TABLE t1 (a int null)
INSERT INTO t1 values (NULL)
INSERT INTO t1 values (0)
INSERT INTO t1 values (1)
GO
-- Print message and perform SELECT statements.
PRINT 'Testing default setting'
DECLARE @varname int
SELECT @varname = NULL
SELECT *
FROM t1
WHERE a = @varname
SELECT *
FROM t1
WHERE a <> @varname
SELECT *
FROM t1
WHERE a IS NULL
GO
-- SET ANSI_NULLS to ON and test.
PRINT 'Testing ANSI_NULLS ON'
SET ANSI_NULLS ON
GO
DECLARE @varname int
SELECT @varname = NULL
SELECT *
FROM t1
WHERE a = @varname
SELECT *
FROM t1
WHERE a <> @varname
SELECT *
FROM t1
WHERE a IS NULL
GO
-- SET ANSI_NULLS to OFF and test.
PRINT 'Testing SET ANSI_NULLS OFF'
SET ANSI_NULLS OFF
GO
DECLARE @varname int
SELECT @varname = NULL
SELECT *
FROM t1
WHERE a = @varname
SELECT *
FROM t1
WHERE a <> @varname
SELECT *
FROM t1
WHERE a IS NULL
GO
-- Drop table t1.
DROP TABLE t1
GO

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧