我正在使用SQL Server2014。假设我有一个名为T1
的表,该表包含2列IdNumber
和Notes
。表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
列的现有内容。
答案 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)
添加到您的列中,并确保要注意,如果Notes
是NULL
,则需要做一些额外的处理:
UPDATE dbo.T1
SET Notes = ISNUL(Notes, '') + ' (TOC)'
WHERE IdNumber IN (SELECT IdNumber FROM dbo.tempID);
使用ISNULL()
运算符,将NULL
转换为空字符串,然后可以将其与(TOC)
字符串串联。如果您忽略此设置,则它将不起作用,因为将NULL
与其他任何内容连接仍将导致NULL