Как разбить строку на новый столбец в командной строке SQLite3? - PullRequest
1 голос
/ 02 августа 2020

Я создаю простую таблицу в SQLite3, используя следующее: sql сценарий:

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");

Затем я добавляю в эту таблицу столбец с именем main_project_number, используя оператор alter table:

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

Итак, я попробовал оператор update с некоторыми строковыми функциями sqlite, как определено здесь :

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

Что я здесь делаю не так?

Ответы [ 2 ]

1 голос
/ 02 августа 2020

Если в столбце project_number нет ведущих 0 s, вы можете сделать это следующим образом:

update projects 
set main_project_number =  project_number + 0;

См. demo .

1 голос
/ 02 августа 2020

Обновление должно относиться к указанной c строке:

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

Если вы используете 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...