【问题标题】:SQL string concatenation, separated by ',' only when column is not nullSQL 字符串连接,仅当列不为空时,以 ',' 分隔
【发布时间】:2015-06-18 10:54:02
【问题描述】:

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

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

逗号开头没有意义。

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

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

【问题讨论】:

  • @ClientValidationRemark 是否有可能成为NULL
  • 不,不可能。

标签: sql sql-server string-concatenation


【解决方案1】:

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

但是,如果您选择存储分隔值,以下是很容易做到的事情:

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

利用将字符串连接到空值将导致空值的事实(注意:仅当您使用string concatenation operator (+)时,而不是当您使用内置函数concat时),我使用了NULLIFClientValidationRemark 中的空字符串值转换为null,然后ISNULLnull + ', ' 转换回空字符串。

【讨论】:

  • 当column 为NOT NULL 并且colum 为NULL 时,这是否有效?
  • 它应该可以工作,因为你没有在列中插入 null,当然,除非 @ClientValidationRemark 的值为 null...
  • > 将字符串连接到空值会导致空值,啊啊,这是我缺少的关键。
  • @Poutrathor 在 SQL Server 中,declare @var varchar(100) = 'string' + null; 将导致 @var 成为 null
  • 我只是检查并且 CONCAT(NULL, 'Not Null') 返回 'Not Null'。 “CONCAT 将空值隐式转换为空字符串。” docs.microsoft.com/en-us/sql/t-sql/functions/… 因此,将字符串连接到 null 值将导致 null 并非总是规则。
【解决方案2】:

这是一个未经测试的样本

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

【讨论】:

  • 我认为他想要的不是THEN NULL,而是THEN @ClientValidationRemark
  • 我需要,当 NULL 或空字符串 THEN @ClientValidationRemark。其他都可以。
【解决方案3】:

试试这个:

您可以使用COALESCE

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 2015-08-02
    相关资源
    最近更新 更多