微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQL编写存储过程以用多列中的数字替换月份例如jan-2到1/2

如何解决SQL编写存储过程以用多列中的数字替换月份例如jan-2到1/2

我有一个文件,其中有多个地址列(10+),其中数字已转换为日期。例如,“ Apartment 5/6” 已转换为“ May-6”。我正在尝试使用动态sql编写存储过程以更新所有这些内容列一次。但是,我认为写这种方法的唯一方法将是极其漫长且可能效率很低。我在下面张贴了当前格式的贴图。我需要对所有12个月和10多个专栏都这样做。

ALTER PROC [Addressfix] @date [VARCHAR](10) 
AS 
  BEGIN 
      DECLARE @sql NVARCHAR(max); 

      BEGIN 
          SET @sql =' update Addresstable_' + @date 
                    + ' set address= case when [address] like ''%1-jan%'' then replace([address],''1-jan'',''1/1'')  when [address] like ''%2-jan%'' then replace([address],''2-jan'',''1/2'')  when [address] like ''%3-jan%'' then replace([address],''3-jan'',''1/3'')  else [address] end from Addresstable_' + @date + ' where address like ''%Jan%'' ' 

          EXEC (@sql) 
      END 

      BEGIN 
          SET @sql=' update Addresstable_' + @date 
                   + ' set address= case when [address] like ''%1-feb%'' then replace([address],''1-feb'',''2/1'')  when [address] like ''%2-feb%'' then replace([address],''2-feb'',''2/2'')  when [address] like ''%3-feb%'' then replace([address],''3-feb'',''2/3'') else [address] end from Addresstable_' + @date + ' where [address] like ''%feb%'' ' 

          EXEC (@sql) 
      END 

      BEGIN 
          SET @sql = 'update Addresstable_' + @date 
                     + '  set address1=  case when [address1] like ''%1-jan%'' then replace([address1],''1/1'')  when [address1] like ''%2-jan%'' then replace([address1],''1/2'')  when [address1] like ''%3-jan%'' then replace([address1],''1/3'')  else [address1] end from Addresstable_' + @date + ' where [address1] like ''%Jan%'' ' 

          EXEC (@sql) 
      END 

      BEGIN 
          SET @sql=' update Addresstable_' + @date 
                   + ' set address1= case when [address1] like ''%1-feb%'' then replace([address1],''2/1'')  when [address1] like ''%2-feb%'' then replace([address1],''2/2'')  when [address1] like ''%3-feb%'' then replace([address1],''2/3'') else [address1] end from Addresstable_' + @date + ' where [address1] like ''%feb%'' ' 

          EXEC (@sql) 
      END 
  END 

有没有更有效的方法来做到这一点?也许使用光标?任何帮助将不胜感激!

解决方法

欢迎使用堆栈溢出。您的问题是“是否有一种更有效的方法?”。

我实际上不知道答案。但是,我想知道是否可以使用单个查询来完成。在Microsoft T-SQL中,可以。这是完成的方法:

UPDATE
        AddressTable_2020_09_14
   SET
        ADDRESS = STUFF( ADDRESS,PATINDEX( '%[1-9]-[jan|feb|mar]%',ADDRESS),5,CASE SUBSTRING( ADDRESS,ADDRESS) + 2,3)
                             WHEN 'jan' THEN '1'
                             WHEN 'feb' THEN '2'
                             WHEN 'mar' THEN '3'
                         END
                            + '/'
                            + SUBSTRING( ADDRESS,ADDRESS ),1 )
                       )
 WHERE
        PATINDEX( '%[1-9]-[jan|feb|mar]%',ADDRESS ) > 0

注意事项:我尚未测试过是否更有效。我们也没有定义在您的情况下更有效的方法。我把那件事留给你。

注意事项:可能无法将其转换为您的SQL版本。

锻炼:我将其动态化,将其扩展到12个月,然后为您添加其他列。请注意,如果您在斜杠前的公寓号大于9,则此方法将无效。

最终免责声明:您的问题将月份放在第一位(5月6日),而您的代码将一天放在第一位(1月1日)。我不确定要为其编码,所以我编码为匹配您的代码而不是您的问题。

祝你好运!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。