Tsql 是否可以重构此语句以删除子查询?
我正试图从一列中获取数据,Tsql 是否可以重构此语句以删除子查询?,tsql,sql-server-2005,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 ) + '-
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
当这起作用时,它会抛出一个错误:
子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时。
虽然我确实理解这个警告所说的,但我真的不知道如何以不同的方式来处理这个问题
我如何重构此文件以删除该警告(或者读得更干净一些)?假设您的
SSNWithDashes
已为NULL
UPDATE dbo.[MyTable]
SET [SSNWithDashes] = LEFT([SSN],3) + '-' + SUBSTRING([SSN],4,2) + '-' + RIGHT([SSN],4)
WHERE LEN(SSN) = 9
假设您的
SSNWithDashes
已为NULL
,则每隔一行保持NULL
UPDATE dbo.[MyTable]
SET [SSNWithDashes] = LEFT([SSN],3) + '-' + SUBSTRING([SSN],4,2) + '-' + RIGHT([SSN],4)
WHERE LEN(SSN) = 9
每隔一行保持NULL
您的第一行是有价值的免责声明。因为如果SSNWithDashes现在对于LEN(SSN)不是9的任何行具有任何无效数据,那么这些行将保持这种方式。如果你知道数据的性质,这绝对是一个好方法,但如果你不知道,这并不是最安全的方法。我同意你的看法,“安全”这个词就是“安全”。我的回答基于“如果MyTable.SSN没有精确的9位数字,我根本不想处理它。”在OP的问题中,您的第一行是一个有价值的免责声明。因为如果SSNWithDashes现在对于LEN(SSN)不是9的任何行具有任何无效数据,那么这些行将保持这种方式。如果你知道数据的性质,这绝对是一个好方法,但如果你不知道,这并不是最安全的方法。我同意你的看法,“安全”这个词就是“安全”。在OP的问题中,我的回答基于“如果MyTable.SSN没有精确的9位数字,我根本不想处理它。”