如何仅更新字段的一部分

san*_*anz 4 sql-server

用户输入了一批记录名称中带有错误后缀的记录 -FY15-Q2而不是FY16-Q1. 所以,记录是这样的:

-LAG-FY15-Q2
-AN-FY15-Q2
-OY-FY15-Q2
-RV-FY15-Q2
etc
Run Code Online (Sandbox Code Playgroud)

他们应该什么时候

-LAG-FY16-Q1
-AN-FY16-Q1
etc
Run Code Online (Sandbox Code Playgroud)

前缀的数量相当有限,因此我总是可以执行多个更新语句,例如SET record name = LAG-FY16-Q1 WHERE record name = LAG-FY15-Q2.

我觉得可能有一种更优雅的方法来使用单个更新语句来做到这一点。也许是修剪过的东西?更复杂的是,一些前缀是三个字母,而另一些是两个字母。

Jul*_*eur 7

你可以尝试这样的事情:

UPDATE Set name = REPLACE(t.name, r.bad, r.good)
FROM yourTable t
INNER JOIN (values
    ('FY15-Q2', 'FY16-Q1')
    , ('FY25-Q2', 'FY36-Q1')
    , ...
) as r(bad, good)
    On t.name like '%'+bad
Run Code Online (Sandbox Code Playgroud)

您可以在 FY25-Q2 之后添加多个模式。

如果您没有多个匹配项,它应该可以正常工作。如果你有大量的行,它可能不是很有效。

如果您的模式位于字符串的中间,请在末尾添加一个%On t.name like '%'+bad+'%'

在运行完整更新之前,您应该首先将UPDATE替换为SELECT并查看应该做什么:

SELECT t.name, newname = REPLACE(t.name, r.bad, r.good), r.bad, r.good
...
Run Code Online (Sandbox Code Playgroud)