在SQL SERVER 2012中使用零更新邮政编码到Pad

时间:2015-07-15 18:12:56

标签: sql-server

我有一个带有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

4 个答案:

答案 0 :(得分:6)

正如您可能已经想到的那样,邮政编码可以从0开始。integers在sql server中不允许0填充。

我认为您的选择为:

  1. 始终在选择
  2. 中填充它
  3. 将列类型更改为更合适的varchar并填充0,最多5个字符。 (你最好这样做)
  4. 新列的步骤:

    1. varchar(5)创建新的zipCode列(例如newZipCode
    2. newZipCode列填充为:

      update tbl_base set newZipCode = right('00000' + cast(zipCode as varchar(5)), 5)

    3. 删除您的int zipcode

    4. 将您的newZipCode列重命名为zipCode
    5. 您的错误的具体原因:

        

      子查询返回的值超过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。完成后,您可以使用replicateconcatright函数格式化数据:

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的内容,以探索为什么您并不真正想要一个子查询来完成您想要完成的任务。

如果需要在运行中进行此转换,可以向表中添加计算列。看到你试图更新具有格式化值的列可能证明最大的问题确实是对数据类型的误解,正如已经指出的那样。