Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 如何在SQLite3命令行中将字符串拆分为新列?_String_Sqlite - Fatal编程技术网

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

String 如何在SQLite3命令行中将字符串拆分为新列?,string,sqlite,String,Sqlite,我正在使用以下.sql脚本在SQLite3中构造一个简单的表: drop table if exists projects; CREATE TABLE projects( "project_number" TEXT, "project_manager" TEXT ); insert into projects ("project_manager", "project_number") values (&q

我正在使用以下.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");
然后,我使用alter table语句向该表添加一个名为main_project_number的列:

alter table projects添加列main\U project\U number整数

然后,我只想用project_number_列的前缀填充这个新列,这样我会得到如下结果:

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
update projects 
set main_project_number =  project_number + 0;
因此,我尝试使用一些sqlite字符串函数执行update语句,定义如下:

更新项目集合主项目编号=从项目中选择子项目编号0,instrproject编号-

然而,这产生了以下结果,这不是我想要的结果…:

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

我在这里做错了什么?

更新应参考特定行:

update projects 
set main_project_number = 
    CASE WHEN instr("project_number", "-") > 0 
         THEN substr("project_number", 0, instr("project_number", "-"))
         ELSE "project_number"
    END
如果您使用的是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;

如果列项目编号没有前导0,则可以这样做:

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
update projects 
set main_project_number =  project_number + 0;

请参阅。

如果项目编号包含字母/,将会发生什么情况。或任何非数字字符?该列的名称为project_number,因此可以安全地假设除-,不存在任何非数字字符。唯一的问题是我在回答中提到的前导0。在我的数据集中,除了-,没有非数字字符,所以这确实是一个可行的解决方案。然而,我同意@Lukasz Szozda的观点,这是一个有点黑客式的解决方案,在某些情况下可能缺乏通用性……这不是黑客式的。它基于您的示例数据,效率更高。如果生成的列是首选的sqlite替代方案,那么我希望使用生成的列。请您看看我的尝试好吗?我已经把它添加到我的原始问题的编辑中…没关系,我遗漏了一个逗号。。。生成的列工作得很好,如果你想在上面的答案中添加生成的列选项,我将很乐意接受它…嗯。。我的印象是,生成的列只应在创建表时声明。。。我想不一定是这样。。。。