求教SQL是否存在这样一函数
  
   fun(A,B,C)
   当A为null时执行B,否则执行C来作为函数返回值

解决方案 »

  1.   

    COALESCE(表达式1,表达式2,....表达式n)从前到后,谁不是NULL就显示谁
    Select employee_id,first_name,last_name,     COALESCE ( appt_quota,(Select Min(appt_quota) From employees),0 ) AS quota
    From employees
    Where department = 'Marketing'
      

  2.   

    程序中用IIF函数,你可以用IF来判断呀
      

  3.   

    CASE WHEN A IS NULL THEN B ELSE C END.......
      

  4.   

    COALESCE应该是你要的,不过我觉得用CASE WEHN也可以DECLARE @T TABLE(COL1 INT)
    INSERT INTO @T 
    SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
    SELECT 
    COALESCE(
     (SELECT 'A' WHERE COL1=1)
    ,(SELECT 'B' WHERE COL1=2)
    ,(SELECT 'C' WHERE COL1=3)
    )
    FROM @T
    /*
    A
    B
    C
    */
      

  5.   

    CASE WHEN也是别的数据库能用的吗?
      

  6.   

    其实我是这个意思
    fun(A,B,A+B)
    如果A为null则返回B,如果A不为null的话则返回A+B
    COALESCE()的话应该是A不为空的话就返回A,而不是B
      

  7.   

    或者按你的思路
    SELECT CASE WHEN A IS NULL THEN B ELSE A+B END
      

  8.   

    DECLARE @id         INT
           ,@编号       INT
           ,@产品序号   VARCHAR(100)
           ,@产量1      VARCHAR(100)
           ,@产量2      VARCHAR(100)DECLARE @temp   TABLE
           (
                编号        INT
               ,产量1       VARCHAR(200)
               ,产量2       VARCHAR(200) 
           )
           
    SET @id = 100
    DECLARE cur_temp CURSOR LOCAL STATIC
    FOR
        SELECT 编号,产品序号,产量1,产量2
        FROM tb
        WHERE 编号 < = @id
    OPEN cur_temp
    FETCH NEXT FROM cur_temp INTO @编号,@产品序号,@产量1,@产量2
    WHILE @@FETCH_STATUS = 0
    BEGIN
        IF NOT EXISTS (SELECT * FROM @temp WHERE 编号 = @编号)
            INSERT INTO @temp( 编号, 产量1, 产量2 )
            VALUES (@编号, @产品序号 + CAST(@产量1 AS VARCHAR), @产品序号 + CAST(@产量2 AS VARCHAR))
        ELSE
            UPDATE @temp
               SET 产量1 = 产量1 + ',' + @产品序号 + CAST(@产量1 AS VARCHAR)
                  ,产量2 = 产量2 + ',' + @产品序号 + CAST(@产量2 AS VARCHAR)
             WHERE 编号 = @编号
             
        FETCH NEXT FROM cur_temp INTO @编号,@产品序号,@产量1,@产量2
    END
    CLOSE cur_temp
    DEALLOCATE cur_temp
    SELECT A.编号
          ,A.产品序号
          ,产量1 = A.产品序号 + ':' + LTRIM(A.产量1) + ISNULL(',' + B.产量1,'') 
          ,产量2 = A.产品序号 + ':' + LTRIM(A.产量2) + ISNULL(',' + B.产量2,'')
    FROM dbo.ta A
    LEFT JOIN @temp B ON A.编号 = B.编号
    WHERE A.编号 <= @id
      

  9.   

    帮忙看下上面代码中的select语句换成下述case when为什么会报错:
    SELECT A.编号 
          ,A.产品序号 
          ,产量1 =case when B.产量1 is null then A.产量1 else A.产品序号 + ':' + LTRIM(A.产量1) + ISNULL(',' + B.产量1,'') end 
         ,产量2 = A.产品序号 + ':' + LTRIM(A.产量2) + ISNULL(',' + B.产量2,'') 
    FROM dbo.ta A 
    LEFT JOIN @temp B ON A.编号 = B.编号 
    WHERE A.编号 <= @id
      

  10.   


    (所影响的行数为 1 行)
    (所影响的行数为 1 行)
    (所影响的行数为 1 行)服务器: 消息 245,级别 16,状态 1,行 39
    将 nvarchar 值 'N1:1,N215,M316' 转换为数据类型为 int 的列时发生语法错误。
      

  11.   

    有非法数值,查看一下表中的数据
    是不是把'N1:1,N215,M316'和数字相加了,如果是想连接字符串的话就先把数字列用CONVERT转换一下
      

  12.   

    SELECT A.编号 
          ,A.产品序号 
          ,产量1 =case when LTRIM(B.产量1) is null then LTRIM(A.产量1) else LTRIM(A.产品序号) + ':' + LTRIM(A.产量1) + ISNULL(',' + B.产量1,'') end 
        ,产量2 = LTRIM(A.产品序号) + ':' + LTRIM(A.产量2) + ISNULL(',' + B.产量2,'') 
    FROM dbo.ta A 
    LEFT JOIN @temp B ON A.编号 = B.编号 
    WHERE A.编号 <= @id全部要用LTRIM转成字符型
      

  13.   

    你的产量都为INT,后面又来了个:其它的东西,当然报错了
      

  14.   

    产量1 =case when B.产量1 is null then LTRIM(A.产量1) else LTRIM(A.产品序号) + ':' + LTRIM(A.产量1) + ISNULL(',' + B.产量1,'') end 
    上面的会报错,下面的不会,这怎么解释????
    产量1= LTRIM(A.产品序号) + ':' + LTRIM(A.产量1) + ISNULL(',' + B.产量1,'')SQL77兄弟的试过了,不成,还会报错 
      

  15.   

    产量1 =case when LTIRM(B.产量1) is null then LTRIM(A.产量1) else LTRIM(A.产品序号) + ':' + LTRIM(A.产量1) + ISNULL(',' + B.产量1,'') end 你这里少了个吧,晕,我的都加上了呀
      

  16.   

    可以了,谢谢SQL77,原来我的case when A else B end 中 A,B字段类型不同,总是马虎,不好意思