简体   繁体   English

如何在 SQLite3 命令行中将字符串拆分为新列?

[英]How to split a string into a new column in SQLite3 command line?

I am constructing a simple table in SQLite3 using the following.sql script:我正在使用以下.sql 脚本在 SQLite3 中构建一个简单的表:

drop table if exists projects;

CREATE TABLE projects(
  "project_number" TEXT,
  "project_manager" TEXT
);

insert into projects ("project_manager", "project_number")
values ("Bob", "11204568-001");
insert into projects ("project_manager", "project_number")
values ("Bill", "11204568-002");
insert into projects ("project_manager", "project_number")
values ("Jack", "11204568-003");
insert into projects ("project_manager", "project_number")
values ("Jill", "11204000");
insert into projects ("project_manager", "project_number")
values ("Fred", "11204569");
insert into projects ("project_manager", "project_number")
values ("Nancy", "11204569-003");

I then add a column to this table called main_project_number using the alter table statement:然后,我使用alter table语句向该表添加一个名为main_project_number的列:

alter table projects add column "main_project_number" integer;

I would then like to populate this new column with only the prefix of the the project_number_column , such that I get a result like this:然后我想只用project_number_column的前缀填充这个新列,这样我就得到了这样的结果:

project_number        project_manager  main_project_number
--------------------  ---------------  -------------------
11204568-001          Bob              11204568
11204568-002          Bill             11204568
11204568-003          Jack             11204568
11204000              Jill             11204000
11204569              Fred             11204569
11204569-003          Nancy            11204569

So I tried an update statement with some sqlite string functions as defined here :因此,我尝试了使用此处定义的一些 sqlite 字符串函数的update语句:

update projects set main_project_number = (select substr("project_number", 0, instr("project_number", "-")) from projects);

This produced the following result, however, which is not what I want...:然而,这产生了以下结果,这不是我想要的......:

project_number        project_manager  main_project_number
--------------------  ---------------  -------------------
11204568-001          Bob              11204568
11204568-002          Bill             11204568
11204568-003          Jack             11204568
11204000              Jill             11204568
11204569              Fred             11204568
11204569-003          Nancy            11204568

What am I doing wrong here?我在这里做错了什么?

Update should refer to specific row:更新应参考特定行:

update projects 
set main_project_number = 
    CASE WHEN instr("project_number", "-") > 0 
         THEN substr("project_number", 0, instr("project_number", "-"))
         ELSE "project_number"
    END

db<>fiddle demo db<>小提琴演示


If you are using SQLite 3.31.0 and above I suggest to use generated columns to avoid running update.如果您使用的是 SQLite 3.31.0 及更高版本,我建议使用生成的列以避免运行更新。

ALTER TABLE projects
ADD COLUMN main_project_number TEXT GENERATED ALWAYS AS
  (CASE WHEN instr("project_number", "-") > 0 
             THEN substr("project_number", 0, instr("project_number", "-"))
             ELSE "project_number"
        END) VIRTUAL;

If the column project_number does not have leading 0 s you can do it like this:如果列 project_number 没有前导0 ,您可以这样做:

update projects 
set main_project_number =  project_number + 0;

See the demo .请参阅演示

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM