有如下程序段:
  DECLARE @text1 char(20)
SET @text1='平均成绩高于75.'
IF ( SELECT AVG(成绩) 
       FROM XS,XS_KC,KC
       WHERE XS.学号= XS_KC.学号 AND XS_KC.课程号=KC.课程号
                  AND KC.课程名=’数据库原理’  ) <75
    SELECT  @text1='平均成绩低于75.'
ELSE
     SELECT @text1如果SELECT 查询查出来是个NULL值,那和75比较是个什么样的结果呢?我运行的结果是平均成绩高于75,NULL和数值比较遵循什么规则?

解决方案 »

  1.   

    NULL和数值比较遵循什么规则?三值逻辑:
    true
    false
    unknownNULL和数值比较=unknownif 5>null print 'true'
    if 5<null print 'true'
    if 5=null print 'true'
      

  2.   

    加个isnull函数,如isnull(avg(成绩),0)
      

  3.   

    IF ( SELECT AVG(成绩)  
           FROM XS,XS_KC,KC 
           WHERE XS.学号= XS_KC.学号 AND XS_KC.课程号=KC.课程号 
                      AND KC.课程名=’数据库原理’  )  <75 如果‘成绩’字段会影响到其平均值的计算
    对于空值有两种处理方法
    1 isnull(avg(成绩),0) 
    2 avg(isnull(成绩,0))
    或 avg(isnull(成绩,75))这样不影响平均值的计算
      

  4.   

    USE XSCJ2
    DECLARE @text1 char(20)
    SET @text1='平均成绩高于75.'
    if (SELECT isnull(AVG(成绩),0) 
           FROM XS,XS_KC,KC
           WHERE XS.学号= XS_KC.学号 AND XS_KC.课程号=KC.课程号
                      AND KC.课程名='数据库原理' )<75     SELECT  @text1='平均成绩低于75.'
    ELSE
         SELECT @text1如果加了这个函数
    提示错误
    警告: 聚合或其它 SET 操作消除了空值。
      

  5.   

    null能不能与数值进行比较,在于你的设置。SET ANSI_NULLS
    指定在对空值使用等于 (=) 和不等于 (<>) 比较运算符时,这些运算符的 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 语句仍返回零行。建议 isnull(n,0)
      

  6.   

    可以使用isnull()判断非空,也可以使用isnumeric()判断是数值型以过滤
      

  7.   


    用isnull()函数,因为null和任何值比较都是为null DECLARE @text1 char(20) 
    SET @text1='平均成绩高于75.' 
    IF ( SELECT isnull(AVG(成绩),0)  
           FROM XS,XS_KC,KC 
           WHERE XS.学号= XS_KC.学号 AND XS_KC.课程号=KC.课程号 
                      AND KC.课程名=’数据库原理’  )  <75 
        SELECT  @text1='平均成绩低于75.' 
    ELSE 
         SELECT @text1