Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   If-In SQL- aber wie? (https://www.delphipraxis.net/146527-if-sql-aber-wie.html)

Teekeks 21. Jan 2010 18:17

Datenbank: Firebird • Version: x • Zugriff über: ??

If-In SQL- aber wie?
 
Hallo!
Ich hab hier wieder einmal ein Problem.
Ich möchte per sql-Statement folgendes machen:
Code:
wenn Datensatz mit dem gesuchten Datum vorhanden dann:
  Daten des Gefundenen Datensatzes Ändern
ansonsten:
  neuen Datensatz anlegen
Wie geht das? Ich weiß das es bei SQL irgendwie auch ein if else gab aber ich weiß nicht wie man das anwendet...

Gruß Teekeks

mkinzler 21. Jan 2010 18:18

Re: If-In SQL- aber wie?
 
SQL-Code:
case..when
oder
SQL-Code:
if()

Teekeks 21. Jan 2010 18:21

Re: If-In SQL- aber wie?
 
hmmm, wie sieht genau die Syntax aus? Ich werde mich auf jeden Fall mal weiter belesen...
EDIT: *arg* ich stelle gerade fest das ich hier Firebird nehme und nicht wie sonst MySQL...

mkinzler 21. Jan 2010 18:35

Re: If-In SQL- aber wie?
 
In FireBird:

SQL-Code:
select iif( <Feld> = <Wert>; <Code wenn Bedingung war>; <Code, wenn Bedingung nicht wahr>), ... from ...
bzw.
SQL-Code:
select case <Feld> when <Wert1> then <Code bei Wert1> when <wert2> ... else <Code wenn kein Wert> ...
oder

SQL-Code:
select case when <Bed1> then <Code bei Bed1> when <Bed2> ... else <Code wenn kein Wert> ...

Teekeks 21. Jan 2010 18:47

Re: If-In SQL- aber wie?
 
Hmmm, was mach ich hier falsch?:
SQL-Code:
SELECT iif( Datum=date'17.11.1858';select * From Arbeitszeiten where Datum='17.11.1858'; {ein Update befehl}) from ARBEITSZEITEN
Mir scheint ich habe das Prinzip noch nicht wirklich verstanden...

mkinzler 21. Jan 2010 18:53

Re: If-In SQL- aber wie?
 
So etwas ginge nur in einer SP oder enem execute block

Mit IIF(), case..when kann man nur Werte wählen/generieren z.B.

SQL-Code:
Select iif( Wert1 > Wert2, Wert1, Wert2) as wert from <Tabelle>;

rwachtel 21. Jan 2010 18:57

Re: If-In SQL- aber wie?
 
http://www.developeando.com/2008/12/...or-insert.html

Teekeks 21. Jan 2010 19:47

Re: If-In SQL- aber wie?
 
Hmmm, nu meckert der rum das der "IF" nicht kennt....
Hier mal mein QC:
Delphi-Quellcode:
  with Form1.Query do
  begin
    close;
    sql.Clear;
    sql.Add('IF EXISTS(SELECT * FROM Arbeitszeiten WHERE Datum = date'''+dat+''' ) THEN'+#10+
            'UPDATE'+#10+
            'Arbeitszeiten'+#10+
            'SET'+#10);
    case Combobox1.ItemIndex of
    0: sql.add(' B1 = '+inttostr(CBBeginn.ItemIndex)+#10+
                ' E1 = '+inttostr(CBEnde.ItemIndex)+#10);
    1: sql.add(' B2 = '+inttostr(CBBeginn.ItemIndex)+#10+
                ' E2 = '+inttostr(CBEnde.ItemIndex)+#10);
    2: sql.add(' B3 = '+inttostr(CBBeginn.ItemIndex)+#10+
                ' E3 = '+inttostr(CBEnde.ItemIndex)+#10);
    3: sql.add(' B4 = '+inttostr(CBBeginn.ItemIndex)+#10+
                ' E4 = '+inttostr(CBEnde.ItemIndex)+#10);
    4: sql.add(' B5 = '+inttostr(CBBeginn.ItemIndex)+#10+
                ' E5 = '+inttostr(CBEnde.ItemIndex)+#10);
    end;

    sql.add('WHERE'+#10+
            'Datum = date'''+dat+''';'+#10+
            'ELSE'+#10+
            'INSERT INTO Arbeitszeiten'+#10+
            '(B1,B2,b3,b4,b5,e1,e2,e3,e4,e5)'+#10+
            'VALUES'+#10+
            '(:b1,:b2,:b3,:b4,:b5,:e1,:e2,:e3,:e4,:e5);'+#10+
            ');');
    with Params do
    begin
      ParamByName('b1').AsInteger:=0;
      ParamByName('e1').AsInteger:=0;
      ParamByName('b2').AsInteger:=0;
      ParamByName('e2').AsInteger:=0;
      ParamByName('b3').AsInteger:=0;
      ParamByName('e3').AsInteger:=0;
      ParamByName('b4').AsInteger:=0;
      ParamByName('e4').AsInteger:=0;
      ParamByName('b5').AsInteger:=0;
      ParamByName('e5').AsInteger:=0;
      case Combobox1.ItemIndex of
      0: begin
           ParamByName('b1').AsInteger:=CBBeginn.ItemIndex*5+1;
           ParamByName('e1').AsInteger:=CBEnde.ItemIndex*5+1;
         end;
      1: begin
           ParamByName('b2').AsInteger:=CBBeginn.ItemIndex*5+1;
           ParamByName('e2').AsInteger:=CBEnde.ItemIndex*5+1;
         end;
      2: begin
           ParamByName('b3').AsInteger:=CBBeginn.ItemIndex*5+1;
           ParamByName('e3').AsInteger:=CBEnde.ItemIndex*5+1;
         end;
      3: begin
           ParamByName('b4').AsInteger:=CBBeginn.ItemIndex*5+1;
           ParamByName('e4').AsInteger:=CBEnde.ItemIndex*5+1;
         end;
      4: begin
           ParamByName('b5').AsInteger:=CBBeginn.ItemIndex*5+1;
           ParamByName('e5').AsInteger:=CBEnde.ItemIndex*5+1;
         end;
      end;
    end;
    execsql;
    Form1.SQLTransaction1.Commit;
  end;
Der meckert wie gesagt gleich beim If rum :(

Woran kann das liegen?

rwachtel 21. Jan 2010 19:50

Re: If-In SQL- aber wie?
 
Du hast den Link aber bis zum Ende gelesen? :mrgreen:

Teekeks 21. Jan 2010 19:54

Re: If-In SQL- aber wie?
 
schon, aber es müsste doch auch so gehen (es wurde ja nur geschrieben das dies nicht so schön ist und auf Schönheit kommt es bei mir nicht an :) ) oder hab ich noch was übersehen (mein Englisch ist ja nicht wirklich soo gut )? :gruebel:

alex517 21. Jan 2010 21:08

Re: If-In SQL- aber wie?
 
Hi,

Zitat:

Zitat von Teekeks
Ich möchte per sql-Statement folgendes machen:
Code:
wenn Datensatz mit dem gesuchten Datum vorhanden dann:
  Daten des Gefundenen Datensatzes Ändern
ansonsten:
  neuen Datensatz anlegen

sieh dir mal dazu

das UPDATE OR INSERT-Statement
SQL-Code:
UPDATE OR INSERT INTO <table or view> [(<column_list>)]
VALUES (<value_list>)
[MATCHING <column_list>]
[RETURNING <column_list> [INTO <variable_list>]]
oder wenn das nicht reicht,

das MERGE-Statement
SQL-Code:
<merge statement> ::=
      MERGE
         INTO <table or view> [ [AS] <correlation name> ]
         USING <table or view or derived table> [ [AS] <correlation name> ]
         ON <condition>
         [ <merge when matched> ]
         [ <merge when not matched> ]

   <merge when matched> ::=
      WHEN MATCHED THEN
         UPDATE SET <assignment list>

   <merge when not matched> ::=
      WHEN NOT MATCHED THEN
         INSERT [ <left paren> <column list> <right paren> ]
            VALUES <left paren> <value list> <right paren>
an.

Voraussetztung Firebird 2.1.

alex

Teekeks 21. Jan 2010 21:34

Re: If-In SQL- aber wie?
 
Hi Danke für eure Hilfe!
Auch an dich Alex (sieht ja spannend aus :) )!
Aber ich hab das ganze jetzt Quick & Dirty gelöst:
Die Logik über Lazarus, und nur einfache SELECTs und UPDATEs und so.
Ganz simpel :D
Auch wenn ich mich vermutlich noch mit dem anderen beschäftigen werde...
Nur das hier muss bis übermorgen fertig werden...

Gruß Teekeks

hoika 22. Jan 2010 05:44

Re: If-In SQL- aber wie?
 
Hallo,

zu #8: der Code in der #7 ist keine SQL-Abfrage, sondern eine Stored Procedure.


Heiko

alex517 22. Jan 2010 07:14

Re: If-In SQL- aber wie?
 
Zitat:

Zitat von Teekeks
Aber ich hab das ganze jetzt Quick & Dirty gelöst:
Die Logik über Lazarus, und nur einfache SELECTs und UPDATEs und so.
Ganz simpel :D


Ganz simpel also,

so wie das? :mrgreen:

SQL-Code:
UPDATE OR INSERT INTO Arbeitszeiten (DATUM, B1, E1, B2, E2, B3, E3, B4, E4, B5, E5)
    VALUES (:DATUM, :B1, :E1, :B2, :E2, :B3, :E3, :B4, :E4, :B5, :E5)
 MATCHING (DATUM);
alex

Teekeks 22. Jan 2010 07:22

Re: If-In SQL- aber wie?
 
WTF!
Nein, ich wusste ja nicht dass das so einfach geht...

Aber ich las das erstmal so wie ich es jetzt habe :)

mkinzler 22. Jan 2010 07:26

Re: If-In SQL- aber wie?
 
Zitat:

Aber ich las das erstmal so wie ich es jetzt habe Smile
Also Bevorzugung der komplizierten, langsamen und fehleranfälligen Variante :gruebel: :zwinker:

rwachtel 22. Jan 2010 08:35

Re: If-In SQL- aber wie?
 
Zitat:

Zitat von Teekeks
WTF!
Nein, ich wusste ja nicht dass das so einfach geht... [...]

Aber genau das stand in dem genannten Link... ;)

QuickAndDirty 22. Jan 2010 08:50

Re: If-In SQL- aber wie?
 
Was wieder beweist das es nicht so gut ist links zu posten,...

rwachtel 22. Jan 2010 11:11

Re: If-In SQL- aber wie?
 
Zitat:

Zitat von QuickAndDirty
Was wieder beweist das es nicht so gut ist links zu posten,...

Wieso das denn? Wenn man sich Abhandlungen nicht komplett durchliest, ist es vollkommen egal, wo diese stehen.

Einzig und alleine die Tatsache, dass Links durchaus eine gewisse Flüchtigkeit aufweisen, mag ich gelten lassen - ich persönlich empfinde allerdings den Nachteil der sowieso schon unüberschaubaren Redundanz an Informationen wesentlich schwerwiegender.

Teekeks 22. Jan 2010 15:47

Re: If-In SQL- aber wie?
 
Das größte Problem an dem ganzen war das einfach gesagt meine Englisch-Kenntnisse schlecht sind...
Ich habe mir schon die ganze Seite durchgelesen, habe aber anscheinend nicht verstanden worauf der da hinaus wollte... :)

Gruß Teekeks :cat:


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz