簡體   English   中英

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

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

我正在使用以下.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 add column "main_project_number" integer;

然后我想只用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

因此,我嘗試了使用此處定義的一些 sqlite 字符串函數的update語句:

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

然而,這產生了以下結果,這不是我想要的......:

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

db<>小提琴演示


如果您使用的是 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;

如果列 project_number 沒有前導0 ,您可以這樣做:

update projects 
set main_project_number =  project_number + 0;

請參閱演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM