Sqlite - 在一个语句中使用SELECT或INSERT和SELECT

use*_*427 12 sql sqlite

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

我有一个名为Values的表:

价值观:

id INT (PK)
data TEXT
Run Code Online (Sandbox Code Playgroud)

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

(非常)天真的方式是:

select id from Values where data = "SOME_DATA";
Run Code Online (Sandbox Code Playgroud)

如果id不为null,请接受它.如果id为null则为:

insert into Values(data) values("SOME_DATA");
Run Code Online (Sandbox Code Playgroud)

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

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

select id from Values where data=(COALESCE((select data from Values where data="SOME_DATA"), (insert into Values(data) values("SOME_DATA"));
Run Code Online (Sandbox Code Playgroud)

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

CL.*_*CL. 12

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

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

INSERT OR IGNORE INTO "Values"(data) VALUES('SOME_DATE');
SELECT id FROM "Values" WHERE data = 'SOME_DATA';
Run Code Online (Sandbox Code Playgroud)

  • @Timmmm 没有办法通过一次查找来完成它。在任何情况下,UNIQUE 或 PK 约束都意味着一个索引,并且该值将被缓存。 (2认同)