SQL Server 如何简化此替换查询?

db2dz4w8  于 2022-12-22  发布在  其他
关注(0)|答案(2)|浏览(153)

我需要更改几个特定报告年份的值,因此这意味着我必须使用当前的查询分别运行每个set语句:

update [Table1]
set [Report Year] = replace([Report Year], '2013 LTP', '2013')
set [Report Year] = replace([Report Year], '2014 LTP', '2014')
set [Report Year] = replace([Report Year], '2015 LTP', '2015')
set [Report Year] = replace([Report Year], '2016 LTP', '2016')
set [Report Year] = replace([Report Year], '2017 LTP', '2017')
set [Report Year] = replace([Report Year], '2018 LTP', '2018')

基本上,我试图从2019年以下的年份中删除LTP。
有没有一种方法可以同时执行一个查询来完成同样的事情?换句话说,我如何简化我的更新查询?

编辑

我需要对多个表执行此操作,比如Table1和Table2。
表1的主键为报告年份,但表2没有该约束。
表格1:

Report Year
2013 LTP
2014 LTP
2015 LTP
2016 LTP
2017 LTP
2018 LTP
2019 LTP
2020 LTP
2020 6+6
2021 LTP
2022 4+8
2022 BP
2022 LTP
BP19
BP20

表二:

Report Year
2013 LTP
2014 LTP
2014 LTP
2015 LTP
2016 LTP
2017 LTP
2018 LTP
2018 LTP
2018 LTP
2019 LTP
2020 LTP
2020 LTP
2020 LTP
2020 6+6
2021 LTP
2022 4+8
2022 BP
2022 LTP
2020 6+6
2020 LTP
2020 6+6
2021 LTP
2022 4+8
2022 LTP
2022 LTP
2022 LTP
BP19
BP20
BP20
3df52oht

3df52oht1#

ReportYear中取出前4个字符并检查其是否为数字。如果是,则将这4位数字转换为整数,并将选择限制为2019年之前的年份。通过将ReportYear更改为该列的前4个字符来更新选择。

    • 样本数据**
create table MyTable
(
  ReportYear nvarchar(10)
);

insert into MyTable (ReportYear) values
('2013 LTP'),
('2014 LTP'),
('2015 LTP'),
('2016 LTP'),
('2017 LTP'),
('2018 LTP'),
('2019 LTP'),
('2020 LTP'),
('2020 6+6'),
('2021 LTP'),
('2022 4+8'),
('2022 BP'),
('2022 LTP'),
('BP19'),
('BP20');
    • 解决方案**
update mt
set mt.ReportYear = left(mt.ReportYear, 4)
from MyTable mt
where isNumeric(left(mt.ReportYear, 4)) = 1
  and try_convert(int, left(mt.ReportYear, 4)) < 2019;

详情和工作示例:fiddle.

2uluyalo

2uluyalo2#

case when [Report Year] not like '%2019 LTP%'
     and  [Report Year] not like '%20[23456789][0123456789] LTP%' -- tweak as necessary
    then replace([Report Year], ' LTP', '')
    else [Report Year]
end

这将一直工作到本世纪末。它将文本作为文本处理,而不需要尝试强制转换为数值类型。
根据样本数据,字母比较可能已经足够了,下面这个方法还可以动态处理年份:

case when [Report Year] < cast(year(getdate() - 1) as char(4))
    then replace([Report Year], ' LTP', '')
    else [Report Year]
end

相关问题