Sqlite - 在一条语句中进行 SELECT 或 INSERT 和 SELECT

标签 sql sqlite

我试图避免编写单独的 SQL 查询来实现以下场景:

我有一个名为值的表:

值(value)观:

id INT (PK)
data TEXT

我想检查表中是否存在某些数据,如果存在,则返回其id,否则插入并返回其id。

(非常)天真的方法是:

select id from Values where data = "SOME_DATA";

如果 id 不为空,则接受它。 如果 id 为空则:

insert into Values(data) values("SOME_DATA");

然后再次选择它以查看其 ID 或使用返回的 ID。

我试图在一行中实现上述功能。 我想我已经接近了,但我还不能做到: 到目前为止,我得到了这个:

select id from Values where data=(COALESCE((select data from Values where data="SOME_DATA"), (insert into Values(data) values("SOME_DATA"));

我试图利用这样一个事实,即第二个选择将返回 null,然后将返回 COALESCE 的第二个参数。到目前为止没有成功。我错过了什么?

最佳答案

您的命令不起作用,因为在 SQL 中,INSERT 不返回值。

如果您在 data 列上有一个唯一的约束/索引,如果您盲目地插入该值,则可以使用它来防止重复;这使用 SQLite's INSERT OR IGNORE extension :

INSERT OR IGNORE INTO "Values"(data) VALUES('SOME_DATE');
SELECT id FROM "Values" WHERE data = 'SOME_DATA';

关于Sqlite - 在一条语句中进行 SELECT 或 INSERT 和 SELECT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13250386/

相关文章:

SQLite 允许将字符串数据插入日期时间列

android - SimpleCursorAdapter 返回字符串的整数键 - 如何转换为相应的字符串?

sql - 以 HAVING 条件分组

sql - 为什么 PREPARE 语句不尊重 INDEXing

MySQL 将值复制到另一个表

sql - 选择多个 id 之前的行

android - 管理 Android SQLite 数据库的工具

mysql - 当两个表没有相同的键时合并数据?

sql - Visual Studio Web 部署卡在输出控制台更新 dll 文件中

mysql - 具有多态连接的 Laravel 查询生成器不适用于 SQLite