问题 Sqlite - SELECT或INSERT和SELECT在一个语句中


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

我有一个名为Values的表:

价值观:

id INT (PK)
data TEXT

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

(非常)天真的方式是:

select id from Values where data = "SOME_DATA";

如果id不为null,那么很好用。 如果id为null则为:

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的第二个参数这一事实。到目前为止没有成功。我错过了什么?

提醒一下,这是一个sqlite3引擎! :P

谢谢!


2935
2017-11-06 11:48


起源

为什么MySQL标签? - CL.
有很多相似之处,也许答案将来自MySQL线程:P - user1782427
您想要的行为是特定于供应商的。某些供应商提供了一种从insert / update命令返回插入/删除值的方法。例如,在SQL Server中,您可以使用OUTPUT子句输出新ID而不进行锁定,而MySQL具有LAST_INSERT_ID以返回上次自动生成的ID - Panagiotis Kanavos


答案:


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

如果你有一个唯一的约束/索引 data 如果您盲目地插入值,您可以使用它来防止重复;这用了 SQLite的的 INSERT OR IGNORE 延期

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

10
2017-11-06 12:36



我明白了,所以你建议插入(最坏的情况下会被忽略),然后选择。我试图在一个班轮上做,但似乎没有工作。谢谢! - user1782427