有条件地使用case语句设置变量

时间:2012-11-02 21:11:49

标签: sql sql-server sql-server-2008

我有以下查询。我试图只添加值,如果值不为null,那么整个变量最终不会为null。显然,下面的查询是错误的,但我不想在测试列上使用ISNULL检查,因为它在变量文本的末尾添加逗号。如果没有变量文本末尾的逗号,我该怎么做呢?有时测试列中会出现空值,有时候不会出现空值。

DECLARE @Test TABLE
(
    test varchar(20)
)

INSERT INTO @Test
SELECT 'adfasdfasd'
UNION ALL
SELECT NULL


DECLARE @DocID varchar(max)

SELECT CASE WHEN test IS NOT NULL THEN @DocID = COALESCE(@DocID + ',' ,'')  + test END
FROM @Test

SELECT @DocID

4 个答案:

答案 0 :(得分:3)

以下任何一项都应该有效

SELECT @DocID = COALESCE(@DocID + ',', '') + test
FROM   @Test
WHERE  test IS NOT NULL 

SELECT @DocID = CASE
                  WHEN test IS NULL THEN @DocID /*No-op. */
                  ELSE COALESCE(@DocID + ',', '') + test
                END
FROM   @Test

答案 1 :(得分:1)

我认为应该是:

SELECT
    @DocID = CASE
        WHEN test IS NOT NULL
            THEN COALESCE(@DocID + ',' ,'')  + test
        ELSE NULL
    END
FROM @Test

这会将最后一行的test值分配给@DocID。这意味着使用此表:

test
--------------------
NULL
adfasdfasd

@DocId将为adfasdfasd

使用此表:

test
--------------------
adfasdfasd
NULL

@DocId将为NULL

答案 2 :(得分:1)

如果您涉及其他字段,则只需要该模式

SELECT @DocID = COALESCE(@DocID + ',' + test, test, @DocID),
       @otherfield ....
FROM @Test;

否则,正如Martin评论的那样,使用WHERE删除NULL使其变得容易

SELECT @DocID = COALESCE(@DocID + ',', '') + test
FROM @Test
WHERE test IS NOT NULL;

答案 3 :(得分:0)

DECLARE @Test TABLE
(
    test varchar(20)
)

INSERT INTO @Test
SELECT 'adfasdfasd'
UNION ALL
SELECT NULL
UNION ALL
SELECT 'Nasenbär'



DECLARE @DocID varchar(max)
Select @DocID=''
SELECT
     @DocID=@DocID + CASE
        WHEN test IS NOT NULL
            THEN Case when LEN(@DocID)>0 then ', ' else '' end + test
        ELSE ''
    END
FROM @Test

SELECT @DocID