在PostgreSQL的每一行插入子字符串

qeeaahzv  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(2)|浏览(173)
create table phone_log(phone_number CHAR(20) NOT NULL,
                      area_code CHAR(10));

INSERT INTO phone_log(phone_number) 
     VALUES ('310-430-9201');
    
INSERT INTO phone_log(phone_number)
    VALUES ('917-829-2876');
    
INSERT INTO phone_log(phone_number)
    VALUES ('424-917-1055')

如何使用SUBSTRING FUNCTION为每行插入每个电话号码的区号?
我希望结果像下面这样:

ztyzrc3y

ztyzrc3y1#

在现有行中使用子字符串函数更新完成。请尝试以下查询:-

UPDATE phone_log
SET area_code = SUBSTRING(phone_number, 1, 3)
WHERE area_code IS NULL;
kq4fsx7k

kq4fsx7k2#

如果area_code的长度可以变化(通常情况下),我建议使用split_part()

INSERT INTO phone_log(phone_number, area_code)
SELECT nr, split_part(nr, '-', 1)
FROM  (
   VALUES
     ('310-430-9201')
   , ('917-829-2876')
   , ('424-917-1055')
   ) input(nr);

参见:

  • 将逗号分隔的列数据拆分为其他列

如果必须冗余地存储area_code的函数相关值(我会尽量避免),请考虑使用生成的列

CREATE TABLE phone_log2 (
  phone_log_id integer GENERATED ALWAYS AS IDENTITY PRIMARY KEY
, phone_number text NOT NULL
, area_code    text GENERATED ALWAYS AS (split_part(phone_number, '-', 1)) STORED
);

然后您原来的简单INSERT命令就可以工作了。
参见:

  • PostgreSQL中的计算/计算/虚拟/派生列

无论哪种方式,你都不想使用char(n),这是character(n)的缩写。使用textvarchar(n)代替。参见:

  • 使用数据类型“text”存储字符串有什么缺点吗?

fiddle

相关问题