我有一个带有Zipcode列的表。 Zipcode列是一个int。 如何更新此列以显示填充的零,以便所有值都是5位数? 我知道如何将此作为SELECT语句,但我不知道如何更新表中的coulmn。以下是我的最大努力。
USE RTCA_new
GO
UPDATE tbl_BASE
SET Zipcode = (
SELECT FORMAT(Zipcode, '00000')
FROM rtca.tbl_BASE
)
产生的错误是:
子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。 声明已经终止。
简而言之,我希望邮政编码值802显示为00802
答案 0 :(得分:6)
正如您可能已经想到的那样,邮政编码可以从0开始。integers
在sql server中不允许0填充。
我认为您的选择为:
varchar
并填充0,最多5个字符。 (你最好这样做)新列的步骤:
varchar(5)
创建新的zipCode
列(例如newZipCode
)将newZipCode
列填充为:
update tbl_base
set newZipCode = right('00000' + cast(zipCode as varchar(5)), 5)
删除您的int zipcode
列
newZipCode
列重命名为zipCode
您的错误的具体原因:
子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。声明已经终止。
在查询中:
UPDATE tbl_BASE
SET Zipcode = (
SELECT FORMAT(Zipcode, '00000')
FROM rtca.tbl_BASE
)
是因为您的陈述中存在逻辑错误或类似错误。您正在尝试将标量值(ZipCode)设置为集合的值(您的select format...
语句。)
SELECT FORMAT(Zipcode, '00000')
FROM rtca.tbl_BASE
本身会为表中的每一行返回一行,您不能将整个结果集设置为标量值。立即错误可以修复如下:
UPDATE tbl_BASE
SET Zipcode = FORMAT(Zipcode, '00000')
这会为zipcode返回一个值...虽然再次由于你当前的表架构,这不会给你你希望的结果,因为integer
s不能用0填充
答案 1 :(得分:2)
它的工作方式不同:
Update tbl_BASE set zipcode = right('000000' + zipcode, 6)
答案 2 :(得分:1)
您需要将Zipcode
列的数据类型更改为varchar
。完成后,您可以使用replicate
,concat
和right
函数格式化数据:
UPDATE tbl_BASE
SET zipcode = right(CONCAT(
replicate('0', 5)
,cast(zipcode as varchar(5))
), 5)
答案 3 :(得分:1)
如果可能的话,最好更改数据库设计(即使您可以通过不使用字符串值来节省行中的一小部分存储空间。)如果您只需要将其转换为仅用于显示目的只是转换问题。
select right('00000' + cast(zipcode as varchar(5)), 5) from T...
-- for use format() on later editions of SQL Server
顺便说一句,我仍然建议您阅读一些关于update
的内容,以探索为什么您并不真正想要一个子查询来完成您想要完成的任务。
如果需要在运行中进行此转换,可以向表中添加计算列。看到你试图更新具有格式化值的列可能证明最大的问题确实是对数据类型的误解,正如已经指出的那样。