SQLite:插入或替换某些列,不要用 NULL 覆盖其他列?

标签 sql sqlite

想象一下,我有一张 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

Results

关于SQLite:插入或替换某些列,不要用 NULL 覆盖其他列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48896321/

相关文章:

c# - Entity Framework 在没有标识列的表上不起作用

mysql - SQL累积前几天的结果,同时获取过去24小时内的记录数

c# - Entity Framework : Mapping existing one-to-many relationship to Model

sql - 克隆同一个表中的记录

sql - 在 firebird sql 中使用整数作为日期

java - 从 Android SQLite 数据库获取最大唯一 ID 不起作用

android - 查询 Room 中对象的类型转换列表

sql - 从 sqlite 表中检索排名

android - SQLite 行限制

mysql - 查询内查询