如何将一列的第一个字符插入另一列?

时间:2016-06-01 12:40:36

标签: postgresql sql-update sql-view

我有一个包含超过30.000个条目的表,并且必须添加一个新列(zip_prefixes),其中包含邮政编码的第一个数字(zcta)。

我成功创建了列:

alter table zeta add column zip_prefixes text;

然后我尝试将值放在列中:

update zeta
set zip_prefixes = (
     select substr(cast (zctea as text)1,1) 
     from zeta)
     )

我当然得到了:

error more than one row returned by a subquery used as an expression

如何将zctea的值的第一位数字输入同一行的zip_prefixes列?

3 个答案:

答案 0 :(得分:3)

无需进行子选择:

update zeta
  set zip_prefixes = substr(zctea, 1, 1);

答案 1 :(得分:1)

更新zeta 设置zip_prefixes = substr(zctea as text)1,1)    不需要选择查询和转换

答案 2 :(得分:0)

  1. 考虑 添加功能相关列。整体上检索第一个角色通常更清洁,更便宜。如果您需要“表格”,我建议您添加VIEW

  2. 为什么需要cast(zctea as text)?邮政编码应以text开头。

  3. 将其命名为zip_prefix,而不是 zip_prefixes

  4. 使用更简单,更便宜的left()

  5. CREATE VIEW zeta_plus AS
    SELECT *, left(zctea::text, 1) AS zip_prefix FROM zeta;  -- or without cast?
    

    如果 需要表中的附加列,并且第一个字符保证是ASCII字符,请考虑数据类型“ char“(带双引号)。 1个字节而不是2个(在磁盘上)或5个(在RAM中)。详细说明:

    如果您需要最小化锁定时间和/或避免在此期间缺少值的可见列,则在一个事务中运行这两个命令。也更快。

    BEGIN;
    ALTER TABLE zeta ADD COLUMN zip_prefix "char";
    UPDATE zeta SET zip_prefixes = left(zctea::text, 1);
    COMMIT;