SQL insert根据select值选择列名

SQL insert根据select值选择列名,sql,sqlite,Sql,Sqlite,希望标题是一个合理的描述 我在db 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) selec

希望标题是一个合理的描述

我在db 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;
然后:

有没有办法用插入或忽略中的内容替换这4个更新?比如:

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,Pete

包括财政司司长吗?插入语句中的列,并将其所有值设置为1:

INSERT OR IGNORE INTO sha256sums(sha256, fs1, fs2, fs3, fs4)  
SELECT sha256, fsno = 2, fsno = 3, fsno = 4, fsno = 5 
FROM files;
可以使用大小写表达式:

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在表中不重复-也就是说,您只希望更改新记录。

表中是否已经存在具有这些fsnos或sha256值的行?文件已完全填充,sha256sums为空。Thx但这似乎只是设置了所有的fs?将每行中的值设置为1。我不知道我是否用上面的sql解释得足够好-只有当对应的via sha256匹配files.fsno值为2等时,它才应该将sha256sums.fs2设置为1。你说:files.fsno范围为2到5,你的update语句设置了所有fs?将插入行的列设置为1。这不是你想要的吗?对不起,一定解释得不清楚。update语句设置为fs?对于fsno=2、3、4、5等的选择子集,设置为1。这也很好,而且稍微整洁一些。他们在做什么、速度等方面有什么不同吗?因为我有2000万行。我已经接受了戈顿的答案,但如果这个更好,我会改变的。我不知道效率。你得试试。一个区别是,此代码将列设置为1或0,并且不为NULL。
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;