2012-11-06 19 views
9

我試圖避免編寫不同的SQL查詢來實現以下場景選擇:sqlite的 - 選擇或插入並在一個statment

我有一個表稱爲值:

值:

id INT (PK) 
data TEXT 

我想檢查的表存在一定的數據,如果是返回它的ID,如果不存在的話,那麼插入它並返回它的ID。

(非常)天真的方法是:

select id from Values where data = "SOME_DATA"; 

如果ID不爲空,大量使用它。 如果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

謝謝!

+0

爲什麼MySQL標記? –

+0

有很多相似的地方,也許答案將來自MySQL的線程:P – user1782427

+0

你想要的行爲是供應商特定的。一些供應商提供了一種方法來從插入/更新命令返回插入/刪除值。例如,在SQL Server可以輸出使用OUTPUT子句沒有鎖定一個新的ID,而MySQL的有LAST_INSERT_ID返回最後自動生成的ID –

回答

9

您的命令不會在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'; 
+0

我明白了,所以你建議無論如何插入(最壞的情況下,它會被忽略)和然後選擇。我試圖用一個班輪完成,但似乎沒有工作。謝謝! – user1782427