2017-03-25 14 views
0

sqliteで行う方法ほとんどのDBでは典型的なことは何ですか?置き換え値はそれぞれSQLiteの条件付きクエリ

[TbName, tbid, act, act, TbName, tbid, TbName, tbid, act] 

ある

if exists(select 1 from tosync where tbname = "%s" and tbid = %d 
    and (act = 1 and %d = 3 or act = 3 and %d = 1) 
begin 
    delete from tosync where tbname = "%s" and tbid = %d 
end 
else 
begin 
    insert into tosync(tbname, tbid, act) values("%s", %d, %d); 
end 

このトピックはsqliteので利用可能な程度UPSERTと同様の問題ではないことに注意してください。

+0

は新しいものUPSERTですか?まず変数を宣言する必要があります – Edward

+0

@Edward何を意味していますか? – notricky

+0

@エドワード、ごめんなさい、あなたの最後のコメントはあなたの最初の質問を私にはっきりとさせませんでした。しかし、私はほとんどのUPSERTは新しいことではないと思います。 – notricky

答えて

0

このようにSQLiteで条件付きクエリを実行することはできません。

ただししばらくのsolutuionは、この特定の状況のた​​めに発見された後

が...詳細はhttp://www.sqlite.org/lang_insert.html

+0

'INSERT'文と' DELETE'文の両方で 'WHERE'条件をコピーして複数のクエリを1つずつ実行することをお勧めしますか? – notricky

+0

私は本当にあなたの質問に答えるだけの提案をしていません。個人的には、おそらく最初にSELECTを実行し、条件付きでコードを実行してから適切なクエリを実行しようとします。しかし、あなたが言っていないように、私はあなたの文脈を知らない。 –

+0

私は参照してください。私もそれも考えていましたが、私はまだ1つのSQLクエリ内で実行することが可能であるという希望を持っていました... – notricky

0

これをチェックアウト... EXISTS、NOT INSERTを...行うことができます。

私は両方の挿入を実行し、同じ条件で行のクエリを削除する必要があります。

insert or replace into tosync (tbname,tbid,act) 
    select      "%s" ,%d ,%d 
where not exists(select 1 from tosync 
       where tbname="%s" and tbid=%d and (act=1 and %d=3 or act=3 and %d=1)); 

delete from tosync 
where tbname="%s" and tbid=%d and exists(select 1 from 
      tosync where tbname="%s" and tbid=%d and (act=1 and %d=3 or act=3 and %d=1));