繁体   English   中英

INSERT INTO 子查询和 ON CONFLICT

[英]INSERT INTO with subquery and ON CONFLICT

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

SQL 可以理解为 SQLite/解析歧义

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM