2012-08-29 65 views
0

我试图从一列中取数据,MyTable.SSN,并将其复制到另一个表中,MyTable.SSNWithDashes,只是格式不同。如果MyTable.SSN没有正好9位数字,我根本不在乎处理它。是否有可能重构此语句以删除子查询?

我已经试过这样:

IF(SELECT LEN([SSN]) FROM [MyTable]) = 9 
UPDATE [MyTable] SET [SSNWithDashes] = LEFT([SSN], 3) + '-' + SUBSTRING([SSN], 4, 2) + '-' + RIGHT([SSN], 4) 
ELSE 
UPDATE [MyTable] SET [SSNWithDashes] = NULL 

虽然这个工作,它抛出一个错误:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

虽然我不明白什么是警告说,我不是真的肯定如何去做这个不同的事情。

我该如何重构此删除该警告(也许读一点清洁剂)?

回答

4
UPDATE dbo.[MyTable] 
    SET [SSNWithDashes] = CASE 
    WHEN LEN(SSN) = 9 THEN 
    LEFT([SSN],3) + '-' + SUBSTRING([SSN],4,2) + '-' + RIGHT([SSN],4) 
    ELSE NULL 
END; 
1

假设你SSNWithDashes已经NULL然后

UPDATE dbo.[MyTable] 
    SET [SSNWithDashes] = LEFT([SSN],3) + '-' + SUBSTRING([SSN],4,2) + '-' + RIGHT([SSN],4) 
WHERE LEN(SSN) = 9 

每隔一行保持NULL

+0

你的第一行是一个有价值的免责声明。因为如果SSNWithDashes现在对于LEN(SSN)不是9的任何行都有任何无效数据,那些行将保持这种状态。如果你知道数据的性质,绝对是一个好方法,但如果你不知道数据的性质,那么最好不要。 –

+0

我同意你的意思,“安全”就是这个词。我回答基于_“如果MyTable.SSN没有9位数字,我根本不在意它的处理。”_在OP的问题中 – codingbiz

相关问题