是否有可能重构此语句以删除子查询?

时间:2012-08-29 00:14:43

标签: tsql sql-server-2005

我正在尝试从一列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.

虽然我明白警告的内容,但我不确定如何以不同的方式解决这个问题。

我怎样才能重构这个以消除警告(也许读一点清洁工)?

2 个答案:

答案 0 :(得分: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 :(得分:1)

假设您的SSNWithDashes已经NULL,那么

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

其他所有行都保持NULL