SQLite:INSERT或REPLACE某些列,不要用NULL覆盖其他列?

bea*_*ans 2 sql sqlite

想象一下,我有一个带有柱子的桌子(冰箱):(日期(pk),水果,蔬菜,淀粉,糖果).这是一个示例行:

date     | fruits | veggies | starches | sweets 
20180220 | melon  | potato  |  pasta   | fudge
Run Code Online (Sandbox Code Playgroud)

我想在冰箱中插入或替换以下列中的某些列:

> INSERT or REPLACE into refrigerator (date, fruits, veggies, starches) VALUES ("20180220", "apple", "carrot", "bread")
Run Code Online (Sandbox Code Playgroud)

当我这样做时,如果我没有为(糖果)指定一个值,它将被NULL覆盖.

date     | fruits | veggies | starches | sweets 
20180220 | apple  | carrot  |  bread   | NULL
Run Code Online (Sandbox Code Playgroud)

这样做的正确方法是什么,不能取代我指定的值?

我确信这显然是显而易见的.随意嘲笑我.

Pit*_*DBA 6

现在它按预期工作,如果不存在,也会插入行.没有UNION ALL,它将无法正常工作.第一个SELECT使用COALESCE()在存在行的情况下保留现有列值.带有NOT EXISTS的第二个SELECT涵盖了行不存在的情况,因此它构造了一个.因此,UNION ALL只返回1行:现有行中的"合并"行或全新行.然后,REPLACE INTO通过主键将此合并/创建的行替换回表中.

CREATE TABLE refrigerator
  (
  date TEXT(8) NOT NULL PRIMARY KEY
  , fruits TEXT(50) NULL
  , veggies TEXT(50) NULL
  , starches TEXT(50) NULL
  , sweets TEXT(50) NULL
  );

INSERT INTO refrigerator (date, fruits, veggies, starches, sweets)
VALUES ("20180220", "melon", "potato", "pasta", "fudge");

REPLACE INTO refrigerator (date, fruits, veggies, starches, sweets)
SELECT
  date
  , COALESCE("apple", fruits) as fruits
  , COALESCE("carrot", veggies) as veggies
  , COALESCE("bread", starches) as starches
  , COALESCE(NULL, sweets) as sweets
 FROM
   refrigerator
 WHERE
   date = "20180220"
UNION ALL
SELECT
  T.date, T.fruits, T.veggies, T.starches, T.sweets
FROM
(
SELECT
  "20180220" as date
  , "apple" as fruits
  , "carrot" as veggies
  , "bread" as starches
  , NULL as sweets
) AS T
WHERE
  NOT EXISTS (SELECT * FROM refrigerator AS R WHERE R.date = T.date);

SELECT date, fruits, veggies, starches, sweets FROM refrigerator;
Run Code Online (Sandbox Code Playgroud)

这是一个SQL小提琴:冰箱SQL小提琴

结果


bea*_*ans 5

我用两行解决了这个问题。

UPDATE refrigerator SET fruits='apple', veggies='carrot', starches='bread' WHERE date='20180220';
Run Code Online (Sandbox Code Playgroud)

然后

INSERT or IGNORE INTO refrigerator (fruits, veggies, starches) VALUES ("apple", "carrot", "bread");
Run Code Online (Sandbox Code Playgroud)

我正在向后考虑事情,这可能会使这里的答案过于复杂。如果存在带有(日期)的行,我首先更新特定列。如果不存在,下一行将插入一个包含所需信息的新行 - 如果存在则忽略它。

这样做是否会出现任何并发症?我已经对其进行了测试,到目前为止一切都按预期工作。