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'
程序中用IIF函数,你可以用IF来判断呀
CASE WHEN A IS NULL THEN B ELSE C END.......
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 */
或者按你的思路 SELECT CASE WHEN A IS NULL THEN B ELSE A+B END
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
帮忙看下上面代码中的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
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转成字符型
你的产量都为INT,后面又来了个:其它的东西,当然报错了
产量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兄弟的试过了,不成,还会报错
产量1 =case when LTIRM(B.产量1) is null then LTRIM(A.产量1) else LTRIM(A.产品序号) + ':' + LTRIM(A.产量1) + ISNULL(',' + B.产量1,'') end 你这里少了个吧,晕,我的都加上了呀
可以了,谢谢SQL77,原来我的case when A else B end 中 A,B字段类型不同,总是马虎,不好意思
Select employee_id,first_name,last_name, COALESCE ( appt_quota,(Select Min(appt_quota) From employees),0 ) AS quota
From employees
Where department = 'Marketing'
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
*/
fun(A,B,A+B)
如果A为null则返回B,如果A不为null的话则返回A+B
COALESCE()的话应该是A不为空的话就返回A,而不是B
SELECT CASE WHEN A IS NULL THEN B ELSE A+B END
,@编号 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
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
(所影响的行数为 1 行)
(所影响的行数为 1 行)
(所影响的行数为 1 行)服务器: 消息 245,级别 16,状态 1,行 39
将 nvarchar 值 'N1:1,N215,M316' 转换为数据类型为 int 的列时发生语法错误。
是不是把'N1:1,N215,M316'和数字相加了,如果是想连接字符串的话就先把数字列用CONVERT转换一下
,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转成字符型
上面的会报错,下面的不会,这怎么解释????
产量1= LTRIM(A.产品序号) + ':' + LTRIM(A.产量1) + ISNULL(',' + B.产量1,'')SQL77兄弟的试过了,不成,还会报错