我有一个包含超过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
列?
答案 0 :(得分:3)
无需进行子选择:
update zeta
set zip_prefixes = substr(zctea, 1, 1);
答案 1 :(得分:1)
更新zeta 设置zip_prefixes = substr(zctea as text)1,1) 不需要选择查询和转换
答案 2 :(得分:0)
考虑 不 添加功能相关列。整体上检索第一个角色通常更清洁,更便宜。如果您需要“表格”,我建议您添加VIEW
。
为什么需要cast(zctea as text)
?邮政编码应以text
开头。
将其命名为zip_prefix
,而不是 。zip_prefixes
使用更简单,更便宜的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;