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

问题描述 投票:0回答:1

我使用的是SQL Server 2014。假设我有一个名为 T1 有2列。IdNumberNotes. 表 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)"。

sql sql-server tsql
1个回答
0
投票

你只需要简单地添加 (TOC) 到您的专栏--并确保意识到如果 NotesNULL,你需要做一些额外的处理。

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

有了 ISNULL() 操作员,你把一个 NULL 变成一个空字符串,然后可以与 (TOC) 字符串。如果你省略了这一点,那么它就不会工作,因为连贯的 NULL 别的不说,结果还是 NULL


2
投票

事实上, concat() 正是你想要的 -- 忽略 NULL 值。

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

唯一要注意的是,你似乎想要的是: ltrim() 的时候,去掉前面的空格。notesNULL:

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

这将删除前面的空格 NULL 价值 -- -- 以及任何领先的 NULLnotes.

你可以用 COALESCE()+ 也是。

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

1
投票

试试这个。

UPDATE T1
SET T1.Notes = ISNULL(T1.Notes + ' ', '') + '(TOC)'
from T1 inner join dbo.tempID T2 on T1.IdNumber=T2.IdNumber
© www.soinside.com 2019 - 2024. All rights reserved.