用T-SQL清理State字段?

时间:2011-02-28 15:24:17

标签: sql arrays sql-update

我们数据库中的State字段很乱。填充时没有验证,因此我们拥有从两个字母缩写到完整州名到拼写错误的状态名称到“test”和“xxxx”等所有内容。 我不打算尝试处理所有事情,但我确实想要将正确的州名修改为缩写。 我有一个有效的州名和缩写列表,但我不知道如何做到这一点:

UPDATE Table SET State = ('AR','AK') 
WHERE (SELECT * FROM Table WHERE State IN ('Arkansas','Alaska'))

基本上,我可以将字段更新为列表中的某个字段吗?

3 个答案:

答案 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