想象一下,我有一张 table (冰箱),上面有几列:(日期(pk)、水果、蔬菜、淀粉、糖果)。这是一个示例行:
date | fruits | veggies | starches | sweets
20180220 | melon | potato | pasta | fudge
我只想插入或替换冰箱中的某些列,如下所示:
> INSERT or REPLACE into refrigerator (date, fruits, veggies, starches) VALUES ("20180220", "apple", "carrot", "bread")
当我这样做时,如果我没有为 (sweet) 指定一个值,它会被 NULL 覆盖。
date | fruits | veggies | starches | sweets
20180220 | apple | carrot | bread | NULL
在不替换我指定的值的情况下,这样做的正确方法是什么?
我敢肯定,这是显而易见的事情。随意 mock 我。
最佳答案
现在它按预期工作,如果该行不存在,也会插入该行。
如果没有 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;
这是一个 SQL fiddle :Refrigerator SQL Fiddle
关于SQLite:插入或替换某些列,不要用 NULL 覆盖其他列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48896321/