(SQL) 编写存储过程以用跨多列的数字替换月份(例如 jan-2 到 1/2)
(SQL) Writing a stored procedure to replace months with numbers across multiple columns (ex jan-2 to 1/2)
我有一个包含多个地址列 (10+) 的文件,其中数字已转换为日期。例如,"Apartment 5/6" 已转换为 "Apartment 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-jan'',''1/1'') when [address1] like ''%2-jan%'' then replace([address1],''2-jan'',''1/2'') when [address1] like ''%3-jan%'' then replace([address1],''3-jan'',''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],''1-feb'',''2/1'') when [address1] like ''%2-feb%'' then replace([address1],''2-feb'',''2/2'') when [address1] like ''%3-feb%'' then replace([address1],''3-feb'',''2/3'') else [address1] end from AddressTable_' + @date + ' where [address1] like ''%feb%'' '
EXEC (@SQL)
END
END
有没有更有效的方法来做到这一点?也许使用游标?任何帮助将不胜感激!
欢迎来到 Stack Overflow。你的问题是“有没有更有效的方法来做到这一点?”。
其实我也不知道答案。但是,我想知道是否可以使用单个查询来完成。在 Microsoft T-SQL 中,它可以。方法如下:
UPDATE
AddressTable_2020_09_14
SET
ADDRESS = STUFF( ADDRESS
,PATINDEX( '%[1-9]-[jan|feb|mar]%', ADDRESS)
,5
,CASE SUBSTRING( ADDRESS
,PATINDEX( '%[1-9]-[jan|feb|mar]%', ADDRESS) + 2
,3)
WHEN 'jan' THEN '1'
WHEN 'feb' THEN '2'
WHEN 'mar' THEN '3'
END
+ '/'
+ SUBSTRING( ADDRESS
,PATINDEX( '%[1-9]-[jan|feb|mar]%', ADDRESS )
,1 )
)
WHERE
PATINDEX( '%[1-9]-[jan|feb|mar]%', ADDRESS ) > 0
警告: 我没有测试过这是否更有效。我们也没有定义在您的上下文中更有效的含义。我把它留给你。
警告: 将此翻译成您的 SQL 版本可能是不可能的。
练习: 我让它动态化,将其延长至 12 个月,并添加额外的列由您决定。请注意,如果斜杠前的公寓号码大于九,这将不起作用。
最终免责声明:您的问题将月份放在第一位(5 月 6 日),但您的代码将日期放在第一位(1 月 1 日)。我不确定要为哪个编码,所以我编码以匹配您的代码而不是您的问题。
祝你好运!
我有一个包含多个地址列 (10+) 的文件,其中数字已转换为日期。例如,"Apartment 5/6" 已转换为 "Apartment 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-jan'',''1/1'') when [address1] like ''%2-jan%'' then replace([address1],''2-jan'',''1/2'') when [address1] like ''%3-jan%'' then replace([address1],''3-jan'',''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],''1-feb'',''2/1'') when [address1] like ''%2-feb%'' then replace([address1],''2-feb'',''2/2'') when [address1] like ''%3-feb%'' then replace([address1],''3-feb'',''2/3'') else [address1] end from AddressTable_' + @date + ' where [address1] like ''%feb%'' '
EXEC (@SQL)
END
END
有没有更有效的方法来做到这一点?也许使用游标?任何帮助将不胜感激!
欢迎来到 Stack Overflow。你的问题是“有没有更有效的方法来做到这一点?”。
其实我也不知道答案。但是,我想知道是否可以使用单个查询来完成。在 Microsoft T-SQL 中,它可以。方法如下:
UPDATE
AddressTable_2020_09_14
SET
ADDRESS = STUFF( ADDRESS
,PATINDEX( '%[1-9]-[jan|feb|mar]%', ADDRESS)
,5
,CASE SUBSTRING( ADDRESS
,PATINDEX( '%[1-9]-[jan|feb|mar]%', ADDRESS) + 2
,3)
WHEN 'jan' THEN '1'
WHEN 'feb' THEN '2'
WHEN 'mar' THEN '3'
END
+ '/'
+ SUBSTRING( ADDRESS
,PATINDEX( '%[1-9]-[jan|feb|mar]%', ADDRESS )
,1 )
)
WHERE
PATINDEX( '%[1-9]-[jan|feb|mar]%', ADDRESS ) > 0
警告: 我没有测试过这是否更有效。我们也没有定义在您的上下文中更有效的含义。我把它留给你。
警告: 将此翻译成您的 SQL 版本可能是不可能的。
练习: 我让它动态化,将其延长至 12 个月,并添加额外的列由您决定。请注意,如果斜杠前的公寓号码大于九,这将不起作用。
最终免责声明:您的问题将月份放在第一位(5 月 6 日),但您的代码将日期放在第一位(1 月 1 日)。我不确定要为哪个编码,所以我编码以匹配您的代码而不是您的问题。
祝你好运!