2017-05-07 21 views
0

作業環境:android osのsqliteを使用します。一括挿入を行う。sqlite - 条件付き置換と挿入

は、以下のスキーマまたはsqlfiddleを考慮する:

CREATE TABLE employee_data 
    (
    id varchar(20) primary key, 
    name varchar(20), 
    dept varchar(20), 
    updation_date varchar(30) 
    ); 

INSERT INTO employee_data 
(id, name, dept, updation_date) 
VALUES 
("1", "john", "tech", "2017-04-30"); 

INSERT INTO employee_data 
(id, name, dept, updation_date) 
VALUES 
("2", "john2", "tech", "2017-05-01"); 

employee_dataテーブルにエントリを追加する際、以下の条件が満たされなければならない:

  1. 特定のエントリがすでに上で比較(存在しない場合idの基準)、それを追加します。

  2. idがすでに存在する場合。追加するエントリのupdation_dateが後ですでに存在するものと比較される場合は、 'updation_date'カラム( )を確認してから、その行を更新します。 他には何もしません。

例: I) updation_dateを確認し、ID = 1のエントリが既に存在するよう("1", "john", "management", "2017-05-01") を挿入する必要があります。 "2017-05-01"はより新しいデータです - 行を更新してください。 ("3", "steve", "management", "2017-06-01") is added.

III)id=2として

("2", "john2", "tech", "2017-04-01"); 

: - そうouputを("1", "john", "management", "2017-05-01")

II) 直接これ 出力を追加し、employee_dataにID = 3となしエントリとして("3", "steve", "management", "2017-06-01") を挿入する必要が最新のupdation_dateを持つ行が存在します("2017-05-01") 何もしません。

検索しようとしましたが解決策が見つかりませんでした。私はどのようにselectステートメントに挿入を使用することができます把握することはできません。デュアルから選択を使用できるかどうか。 似たような使用例では、Oracleでmergeを使用したことを覚えています。

注: updation_date列は、比較を容易にするために、タイムスタンプ形式または日付形式に変更できます。

ありがとうございました。

+2

あなたは挿入または更新を意味しますか? – Sami

+0

私はトリガーを使う必要があると思います。 https://sqlite.org/lang_createtrigger.html –

+0

は挿入も更新もしません。 –

答えて

0

SQLiteは組み込みデータベースです。アプリケーションに複雑なロジックを実装することになっています:

void conditionalReplaceAndInsert(ContentValues cv) 
{ 
    String oldDate = DatabaseUtils.stringForQuery(db, 
       "SELECT updation_date FROM employee_data WHERE id = ?", 
       new String[]{ cv.getAsString("id") }); 
    if (oldDate.equals("")) 
     db.insertOrThrow("employee_data", null, cv); 
    else if (oldDate.compareTo(cv.getAsString("updation_date")) < 0) 
     db.update("employee_data", cv, "id = ?", 
        new String[]{ cv.getAsString("id") }); 
    else 
     ; // do nothing 
}