SQL вставить выбор имени столбца в зависимости от выбранного значения - PullRequest
0 голосов
/ 14 февраля 2020

Надеюсь, что название является разумным описанием.

У меня есть 2 таблицы в БД (sqlite).

CREATE TABLE files (
  name TEXT,
  sha256 TEXT,
  fsno INT
);

CREATE TABLE sha256 (
  sha256 TEXT,
  fs1 INT,
  fs2 INT,
  fs3 INT,
  fs4 INT
);

files.fsno варьируется от 2 до 5.

Я делаю:

INSERT OR IGNORE INTO sha256sums (sha256)  select sha256 from files;

Тогда:

update sha256sums set fs2 = 1 where sha256 in (select sha256 from files where fsno = 2);
update sha256sums set fs3 = 1 where sha256 in (select sha256 from files where fsno = 3);
update sha256sums set fs4 = 1 where sha256 in (select sha256 from files where fsno = 4);
update sha256sums set fs5 = 1 where sha256 in (select sha256 from files where fsno = 5);

Есть ли способ заменить эти 4 обновления чем-то в INSERT OR IGNORE? Что-то вроде:

INSERT OR IGNORE INTO sha256sums (sha256, fs2, fs3, fs4, fs5)  
select 
sha256, fsno==2?1:0, fsno==3?1:0, fsno==4?1:0, fsno==5?1:0 
from files;

БД - Sqlite.

TIA, Пит

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

Вы можете использовать выражение case:

INSERT OR IGNORE INTO sha256sums (sha256, fs2, fn3, fs4, fsno5) 
    select sha256,
           (case when fsno = 2 then 1 end),
           (case when fsno = 3 then 1 end),
           (case when fsno = 4 then 1 end),
           (case when fsno = 5 then 1 end)
    from files;

Это предполагает, что sha256 не дублируется в таблице - то есть вы хотите, чтобы только новые записи изменялись.

0 голосов
/ 14 февраля 2020

Включите столбцы fs? в оператор INSERT и установите для всех их значений значение 1:

INSERT OR IGNORE INTO sha256sums(sha256, fs1, fs2, fs3, fs4)  
SELECT sha256, fsno = 2, fsno = 3, fsno = 4, fsno = 5 
FROM files;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...