17

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

我有一个名为 Values 的表:

价值观:

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 的第二个参数。至今没有成功。我错过了什么?

4

1 回答 1

17

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

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

INSERT OR IGNORE INTO "Values"(data) VALUES('SOME_DATE');
SELECT id FROM "Values" WHERE data = 'SOME_DATA';
于 2012-11-06T12:36:04.943 回答