如何在特定列的现有数据末尾插入特定文本?

时间:2020-06-01 08:34:59

标签: sql sql-server tsql

我正在使用SQL Server2014。假设我有一个名为T1的表,该表包含2列IdNumberNotes。表T1包含约300,000条记录。

Notes列是自由文本列,表示用户已在其中输入自由文本。某些记录的此列为空(未输入文本)。

我现在有一个IdNumbers的列表,我需要在T1的“注释”列中添加此特定文本“(TOC)”,最好在其中已经存在的任何文本的末尾。我创建了一个名为tempID的表,其中包含所有这些IDNumber的列表。

T1的外观(提取)如下:

IdNumber        Notes
--------------------------------------------------------------------
   101          Guest does not like beer
   154          wedding anniversary - to prepare a cake - 03052020
   160

IdNumber = 160具有空白/空白Notes列。

这是我要实现的(假设需要将“(TOC)”添加到这3个IDNumber中):

IdNumber        Notes
------------------------------------------------------------------------
  101           Guest does not like beer (TOC)
  154           wedding anniversary - to prepare a cake - 03052020 (TOC)
  160           (TOC)

我该怎么做(我有大约1500个IdNumbers列表)?

这是我无法执行SQL查询的地方:

UPDATE T1
INSERT INTO [Notes]
VALUE ('(TOC)') ----stuck here!
WHERE [IdNumber] in (Select [IdNumber] from [tempID]

我认为应该以不同的方式进行操作,因为我上面的查询将简单地用“(TOC)”覆盖Notes列的现有内容。

3 个答案:

答案 0 :(得分:2)

实际上,concat()确实可以满足您的要求-忽略了NULL的值:

UPDATE dbo.T1
    SET Notes = CONCAT(Notes, ' (TOC)')
    WHERE IdNumber IN (SELECT t.IdNumber FROM dbo.tempID t);

唯一的警告是,当ltrim()notes时,您似乎希望NULL删除前导空格:

UPDATE dbo.T1
    SET Notes = LTRIM(CONCAT(Notes, ' (TOC)'))
    WHERE IdNumber IN (SELECT t.IdNumber FROM dbo.tempID t);

这将删除NULL值的前导空格-以及NULL中的所有前导notes

您也可以使用COALESCE()+来做到这一点:

UPDATE dbo.T1
    SET Notes = COALESCE(Notes + ' ', '') + '(TOC)'
    WHERE IdNumber IN (SELECT t.IdNumber FROM dbo.tempID t);

答案 1 :(得分:1)

尝试一下:

UPDATE T1
SET T1.Notes = ISNULL(T1.Notes + ' ', '') + '(TOC)'
from T1 inner join dbo.tempID T2 on T1.IdNumber=T2.IdNumber

答案 2 :(得分:0)

您只需将(TOC)添加到您的列中,并确保要注意,如果NotesNULL,则需要做一些额外的处理:

UPDATE dbo.T1
SET Notes = ISNUL(Notes, '') + ' (TOC)'
WHERE IdNumber IN (SELECT IdNumber FROM dbo.tempID);

使用ISNULL()运算符,将NULL转换为空字符串,然后可以将其与(TOC)字符串串联。如果您忽略此设置,则它将不起作用,因为将NULL与其他任何内容连接仍将导致NULL