17

次のシナリオを実現するために、個別の 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 を使用します。

上記の機能を1行で作成しようとしています。私は近づいていると思いますが、まだそれを作ることができませんでした: これまでのところ、私はこれを得ました:

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

2 番目の選択が null を返し、COALESCE の 2 番目の引数が返されるという事実を利用しようとしています。これまでのところ成功していません。私は何が欠けていますか?

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 に答える