1

我想将 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;

到目前为止这有效,但我真的需要这个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;

我收到此错误:

[SQLITE_ERROR] SQL error or missing database (near "DO": syntax error)
4

1 回答 1

1

来自SQLite/Parsing Ambiguity 所理解的 SQL

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

所以你需要 WHERE 子句,但它可以是简单的WHERE true或只是WHERE 1.

于 2022-02-12T07:57:30.117 回答