2012-08-29 68 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

相關問題