6 Stimmen

IF-Anweisung in SQLite: aktualisieren oder einfügen?

Ich kann diese Abfrage nicht mit SQLite ausführen

if 0<(select COUNT(*) from Repetition where (Word='behnam' and Topic='mine'))
begin
 update Repetition set Counts=1+ (select Counts from Repetition where (Word='behnam' and Topic='mine'))
end
else
begin
    insert Repetition(Word,Topic,Counts)values('behnam','mine',1)
end

Es wird "Syntaxfehler bei IF" angezeigt. Wie kann ich das Problem lösen?

6voto

jklemmack Punkte 3418

SQLite verfügt nicht über eine IF-Anweisung ( siehe die Liste der unterstützten Abfragen )

Insetad, check out ERIC B Vorschlag eines anderen Gewinde . Im Grunde genommen handelt es sich um ein UPSERT (UPdate, wenn der Datensatz existiert, INSERT, wenn nicht). Eric B. hat ein gutes Beispiel dafür, wie man dies in SQLite-Syntax unter Verwendung der "INSERT OR REPLACE"-Funktionalität in SQLite tun kann. Im Grunde würden Sie etwas tun wie:

INSERT OR REPLACE INTO Repetition (Word, Topic, Counts)    
VALUES (  'behnam', 'mine',
          coalesce((select Counts + 1 from Repetition 
                   where Word = 'behnam', AND Topic = 'mine)
                   ,1)
       )

3voto

Nico Punkte 304

Ein anderer Ansatz ist INSERT ... SELECT ... WHERE ... EXISTS [oder nicht] (SELECT ...);

Ich mache so etwas ständig, und ich verwende auch den Vorschlag von jklemmack. Und ich mache es auch für andere Zwecke, z. B. für JOINs in UPDATEs (was SQLite3 nicht unterstützt).

Zum Beispiel:

CREATE TABLE t(id INTEGER PRIMARY KEY, c1 TEXT NOT NULL UNIQUE, c2 TEXT);
CREATE TABLE r(c1 TEXT NOT NULL UNIQUE, c2 TEXT);
INSERT OR REPLACE INTO t (id, c1, c2)
  SELECT t.id, coalesce(r.c1, t.c1), coalesce(r.c2, t.c2)
  FROM r LEFT OUTER JOIN t ON r.c1 = t.c1
  WHERE r.c2 = @param;

Das WHERE dort hat die Bedingung, die Sie in Ihrem IF haben würden. Der JOIN im SELECT bietet den JOIN, den SQLite3 in UPDATE nicht unterstützt. Das INSERT OR REPLACE und die Verwendung von t.id (die NULL sein kann, wenn die Zeile in t nicht existiert) bilden zusammen die THEN- und ELSE-Körper.

Sie können dies immer wieder anwenden. Wenn Sie drei Anweisungen (die nicht irgendwie zu einer einzigen zusammengeführt werden können) im DANN-Teil des WENN-Teils haben, müssen Sie drei Anweisungen mit der WENN-Bedingung in ihren WEN-Teilen haben.

0voto

chacham15 Punkte 13038

Dies wird als UPSERT (d.h. UPdate oder inSERT) bezeichnet. Es hat seine Formen in fast jeder Art von Datenbank. Sehen Sie sich diese Frage für die SQLite-Version an: SQLite - UPSERT *nicht* INSERT oder REPLACE

0voto

Arsen Khachaturyan Punkte 7275

Eine Möglichkeit, die ich gefunden habe, basiert auf SQL WHERE Klausel true/false Erklärung:

 SELECT * FROM SOME_TABLE
 WHERE
 ( 
    SELECT SINGLE_COLUMN_NAME FROM SOME_OTHER_TABLE
    WHERE 
    SOME_COLUMN = 'some value' and 
    SOME_OTHER_COLUMN = 'some other value'
  )

Das bedeutet konkret, dass Sie einige QUERIES wenn ein anderer QUERY gibt 'beliebiges' Ergebnis zurück.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X