我使用的是SQL Server 2014。假设我有一个名为 T1
有2列。IdNumber
和 Notes
. 表 T1
含有约30万条记录。
该 Notes
列是一个自由文本列,意味着用户在其中输入了自由文本。有些记录的这一列是空的(没有输入文本)。
我现在有一个列表 IdNumbers
的注释栏中添加"(TOC) "这一特定文字。T1
理想的情况是在任何已经存在的文本的结尾处。我创建了一个名为 tempID
其中包含所有这些IdNumbers的列表。
下面是表 T1
的样子(提取)。
IdNumber Notes
--------------------------------------------------------------------
101 Guest does not like beer
154 wedding anniversary - to prepare a cake - 03052020
160
IdNumber = 160
有一个空白的空 Notes
列。
这是我想实现的(假设"(TOC) "需要添加到这3个IdNumbers中)。
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]
我认为应该用不同的方式,因为我的上述查询将简单地覆盖现有的内容。Notes
列有"(TOC)"。
你只需要简单地添加 (TOC)
到您的专栏--并确保意识到如果 Notes
是 NULL
,你需要做一些额外的处理。
UPDATE dbo.T1
SET Notes = ISNUL(Notes, '') + ' (TOC)'
WHERE IdNumber IN (SELECT IdNumber FROM dbo.tempID);
有了 ISNULL()
操作员,你把一个 NULL
变成一个空字符串,然后可以与 (TOC)
字符串。如果你省略了这一点,那么它就不会工作,因为连贯的 NULL
别的不说,结果还是 NULL
事实上, 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);
试试这个。
UPDATE T1
SET T1.Notes = ISNULL(T1.Notes + ' ', '') + '(TOC)'
from T1 inner join dbo.tempID T2 on T1.IdNumber=T2.IdNumber