【问题标题】:How to insert first character of one column into another column?如何将一列的第一个字符插入另一列?
【发布时间】:2016-09-30 20:06:27
【问题描述】:

我有一个包含超过 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 列?

【问题讨论】:

  • 那么你有答案了吗?

标签: postgresql sql-update sql-view


【解决方案1】:

不需要子选择:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:
      1. 考虑添加功能相关的列。动态检索第一个字符通常更清洁、更便宜。如果您需要一个“表格”,我建议添加一个VIEW

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

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

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

      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;
      

      【讨论】:

      • 好的,非常感谢。您的回答帮助很大。
      猜你喜欢
      • 2012-09-25
      • 2011-08-13
      • 2015-01-18
      • 2021-09-01
      • 2015-02-11
      • 1970-01-01
      • 2013-11-24
      • 1970-01-01
      相关资源
      最近更新 更多