String 如何在SQLite3命令行中将字符串拆分为新列?
我正在使用以下.sql脚本在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
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替代方案,那么我希望使用生成的列。请您看看我的尝试好吗?我已经把它添加到我的原始问题的编辑中…没关系,我遗漏了一个逗号。。。生成的列工作得很好,如果你想在上面的答案中添加生成的列选项,我将很乐意接受它…嗯。。我的印象是,生成的列只应在创建表时声明。。。我想不一定是这样。。。。