2016-11-30 14 views
0

Ich suche nach Hilfe mit einer SQL-Abfrage mit einer IF-THEN-ELSE-Konstruktion. Es dreht sich um den Automatismus in meiner Anwendung nach einer Einfügung einer neuen Zeile in eine "Dump" -Tabelle - abhängig von dem Wert einer Spalte - in eine spezielle Tabelle zu kopieren.CASE-WHEN-THEN-ELSE Konstruieren in SQL

Um sich zu trainieren, habe ich einen Test mit einem DB-Tabelle prob und ein Tisch prob2

Der Auslösemechanismus unter Kontrolle ist. Jetzt kommt es immer noch an, was mit dieser speziellen Regel zu tun ist. Dies ist abhängig vom Wert von „c“

In Worten das ist, was ich will:

IF (the value in column c of the prob-table - from the row with the highest ID of the prob table = 2) 
THEN (Now, copy this line to the prob2 table) 
END IF 

diese Weise, die ich für jeden Wert von „c“ kann ausführen eine andere Aktion in einem IF-THEN - ELSEIF - DANN - ELSEIF - DANN - ENDE IF Konstruktion.

Tabelle prob:

- id |  a  | b | c | 
- ----+---------------+---+---+ 
- 1 |std745_900w | 5 | 4 | 
- ----+---------------+---+---+ 
- 2 |std745_900w | 2 | 3 | 
- ----+---------------+---+---+ 
- 3 |std745_900w | 1 | 9 | 
- ----+---------------+---+---+ 
- 4 |std745_900w | 3 | 2 | 
- ----+---------------+---+---+ 

Meine Übersetzung in eine (nicht funktionsfähig) SQL Query

IF 
    (SELECT c FROM prob WHERE id = (SELECT MAX(id) FROM prob) = 2) 
THEN 
    (INSERT INTO prob2 (id, a, b, c) 
    SELECT id, a, b, c FROM prob WHERE id = (SELECT MAX(id) FROM prob)) 
END IF 

die Abfrage nach dem IF in Klammern) ->SELECT c FROM prob WHERE id = (SELECT MAX(id) FROM prob) < - arbeitet oke und Ergebnisse in "2" Die Abfrage nach dem THEN ->INSERT INTO prob2 (id, a, b, c) SELECT id, a, b, c FROM prob WHERE id = (SELECT MAX(id) FROM prob) < - funktioniert gut SQL, versteht jedoch nicht den Ausdruck der "IF-Anweisung".

Dies ist mysql auf einem MariaDB

Kann jemand helfen?

+0

Sie sagen, Sie haben einen Insert-Trigger für die Tabelle prob und Sie möchten diese Logik in diesen Trigger einbeziehen? –

+0

In MySQL ein if ... then - else ... end if-Anweisung kann nur in gespeicherten Programmen (Prozedur, Funktion, Trigger) verwendet werden, Sie können es nicht ausführen wie es ist. Das Abrufen von Daten aus der Datenbank unterscheidet sich ebenfalls geringfügig. – Shadow

+0

Ja, in MariaDB können Sie einen Trigger nach einem Einfügen in eine Tabelle definieren. Dies löst eine SQL-Abfrage aus. Ich habe es mit einer einfachen Abfrage getestet und das funktioniert. Mein Problem liegt im Test im IF-Teil des it-then-else-Konstrukts –

Antwort

0

können Sie

CASE WHEN (your_test) THEN (do_something_here) ELSE 

verwenden Sie viele nutzen können ‚wenn ... dann‘

0

einige Details fehlen, aber man kann diese prozedurale Sprache in MySQL tun und aus dem Lockruf:

CREATE PROCEDURE COPY_ROW() 
    BEGIN 
     DECLARE pId INT DEFAULT 0; 
     DECLARE pC INT DEFAULT 0; 

     SELECT id, c 
     INTO pId, pC 
     FROM prob 
     WHERE id = (SELECT MAX(id) FROM prob); 

     IF(pC = 2) THEN 
      INSERT INTO prob2 (id, a, b, c) 
      SELECT id, a, b, c FROM prob WHERE id = pId; 

     END IF; 
    END; 
+0

Und das funktioniert für mysql tut es? –

+0

Ja, es ist die prozedurale Sprache für MySql – aKiRa

+0

Er kein plsql ist die prozedurale Sprache für Oracle –

0
SELECT @c := c FROM prob ORDER BY id DESC LIMIT 1; 
IF @c = 2 THEN 
    INSERT INTO prob2 (id, a, b, c) 
     SELECT id, a, b, c FROM prob ORDER BY id DESC LIMIT 1; 
END IF 

Sie hatte Probleme mit Klammern. Und Unterabfragen zu erhalten MAX(id) sind oft besser über ORDER BY getan.

+0

Ich nehme an, dass diese Konstruktion nur in einem Verfahren funktioniert? MariaDB bietet einen Syntaxfehler @ c –

+0

True. 'IF', als eine Anweisung, funktioniert nur in gespeicherten Routinen. Würden Sie erklären, was Sie zu tun versuchen? Es kann einen noch einfacheren Weg geben, es zu tun. –

0

Vielen Dank für die Informationen und Tipps. Die Arbeit mit einem Verfahren ist die Antwort auf dieses Problem. Danke an euch alle!