使用子查询和 ON CONFLICT 进行 INSERT INTO

Ral*_*ann 1 sqlite upsert on-clause sql-update sql-insert

我想将 JSON 数组中的所有元素插入到表中:

INSERT INTO local_config(parameter, value)
SELECT json_extract(j.value, '$.parameter'), json_extract(j.value, '$.value')
FROM json_each(json('[{"parameter": 1, "value": "value1"}, {"parameter": 2, "value": "value2"}]')) AS j
WHERE value LIKE '%'
ON CONFLICT (parameter) DO UPDATE SET value = excluded.value;
Run Code Online (Sandbox Code Playgroud)

到目前为止这有效,但我真的需要这个WHERE value LIKE '%'条款吗?

当我删除它时:

INSERT INTO local_config(parameter, value)
SELECT json_extract(j.value, '$.parameter'), json_extract(j.value, '$.value')
FROM json_each(json('[{"parameter": 1, "value": "value1"}, {"parameter": 2, "value": "value2"}]')) AS j
ON CONFLICT (parameter) DO UPDATE SET value = excluded.value;
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

[SQLITE_ERROR] SQL error or missing database (near "DO": syntax error)
Run Code Online (Sandbox Code Playgroud)

for*_*pas 6

来自SQLite/解析歧义所理解的 SQL

当附加 UPSERT 的 INSERT 语句从 SELECT 语句获取其值时,存在潜在的解析歧义。解析器可能无法判断“ON”关键字是否引入了 UPSERT 或者它是否是联接的 ON 子句。要解决此问题,SELECT 语句应始终包含 WHERE 子句,即使该 WHERE 子句只是“WHERE true”。

因此,您需要 WHERE 子句,但它可以是简单的WHERE true或只是WHERE 1.