SQL 字符串拼接,只在列不为空时用','分隔

SQL string concatenation, separated by ',' only when column is not null

我想在我的数据库中更新字符串 (varchar) 列。我想连接 ',' + 值。

这是可行的,但如果数据库列中的值为空,我不想添加“,”(逗号)。

开头没有逗号。

UPDATE ImportState
SET ClientValidationRemark = ClientValidationRemark + ',' + @ClientValidationRemark
WHERE Id=@ImportId

当然,如果值不为空,我想每次都添加逗号。你知道任何简单、干净的方法来做到这一点吗?我总是更新一行,@ImportId是主键。

这是一个未经测试的样本

UPDATE ImportState
SET ClientValidationRemark =
CASE ClientValidationRemark WHEN Null THEN @ClientValidationRemark
                            WHEN '' THEN @ClientValidationRemark
                            ELSE ClientValidationRemark + ',' + @ClientValidationRemark
END 
WHERE Id=@ImportId

好吧,首先让我说,将分隔字符串保留在单个列中是一种糟糕的数据库设计,只有一个例外:当数据从未在 sql 中使用并且需要作为分隔字符串时在应用程序中。在超过 16 年的编程生涯中,我只存储过一次这样的值,而且正是这种情况。

但是,如果您选择存储分隔值,这里有一些简单的操作:

UPDATE ImportState
SET ClientValidationRemark = ISNULL(NULLIF(ClientValidationRemark, '') + ',', '') +
                             @ClientValidationRemark
WHERE Id=@ImportId

利用将字符串连接到空值将导致空值的事实(注意:仅当您使用 string concatenation operator (+), Not when you use the built in function concat 时),我使用 NULLIF 将空字符串值转换为ClientValidationRemark 为 null,然后 ISNULLnull + ', ' 转换回空字符串。

试试这个:

您可以使用 COALESCE.

UPDATE ImportState
SET 
    ClientValidationRemark = 
           COALESCE(ClientValidationRemark + COALESCE(',' + @ClientValidationRemark,''), 
                    @ClientValidationRemark) 
WHERE Id=@ImportId