我们数据库中的State字段很乱。填充时没有验证,因此我们拥有从两个字母缩写到完整州名到拼写错误的状态名称到“test”和“xxxx”等所有内容。 我不打算尝试处理所有事情,但我确实想要将正确的州名修改为缩写。 我有一个有效的州名和缩写列表,但我不知道如何做到这一点:
UPDATE Table SET State = ('AR','AK')
WHERE (SELECT * FROM Table WHERE State IN ('Arkansas','Alaska'))
基本上,我可以将字段更新为列表中的某个字段吗?
答案 0 :(得分:3)
假设您有一个包含列的查找表:State&缩写
Update MyTable
from MyTable t1
Set State = (Select Abbreviation From OtherTable t2 where t1.State = t2.State)
答案 1 :(得分:1)
您可以使用这样的案例陈述。
declare @T table ([State] varchar(20))
insert into @T values
('Arkansas'),
('Arkansas'),
('Alaska'),
('None')
update @T set
[State] = case [State]
when 'Arkansas' then 'AR'
when 'Alaska' then 'AL'
else [State]
end
where
[State] IN ('Arkansas','Alaska')
答案 2 :(得分:1)
你需要一个查找表(用于清理并继续验证条目),正如BobTodd建议的那样,但我也会使用
创建一个临时映射表SELECT INTO State_Clean_Up
DISTINCT [State] as old_state_name, 'AAA' as new_state_name -- placeholder
FROM Your_Table
现在,对于繁琐的位,编辑映射表并根据旧名称将所有new_state_name
字段设置为正确的值。
使用映射表上的连接更新表。
UPDATE Your_Table
SET [State] = new_state_name
FROM Your_Table INNER JOIN State_Clean_Up
ON Your_Table.State = State_Clean_Up.old_state_name
清理后(记得备份原始数据,或至少使用交易),您可以删除State_Clean_Up
表。
编辑当您执行SELECT DISTINCT...
部分时,您可以在两列中选择旧名称,然后您只需编辑要清理的名称,其他所有名称将保持不变,例如
SELECT INTO State_Clean_Up
DISTINCT [State] as old_state_name, [State] as new_state_name
FROM Your_Table