![]() |
SQL: NULL+1 ... So geht das nicht...
Hi...
Ich habe da ein Problem. Ich möchte ein SQL Statement (INSERT) absetzen an eine Interbase (6.0) Datenbank und benutze dafür eine TSQLConnection. Fragt mich bitte nicht warum das so ist. Der Entwickler des Programms wird sich irgenwas dabei gedacht haben... hoffendlich... Diese Kombination umzustoßen sprengt jedenfalls jeden Rahmen... Folgendes soll passieren: Ein Datensatz soll geschrieben werden der einem Uniqe-Key unterliegt. Sollte es einmal notwendig sein, dass ein Eintrag doppelt vorkommt, so muss eine Art 2.Schlüssel gepflegt werden, der praktisch alle doppelten Einträge durchnummeriert damit sie wieder Uniqe sind. Ich habe ein Statement ersonnen, dass dies auch sehr gut erledigt:
SQL-Code:
Ich hab es aus dem Gedächtnis rekostruiert, hoffe da ist nun kein Fehler drin :stupid:
INSERT INTO tabelle (Spalte1, Spalte2, ..., Spalte9) VALUES (Value1, Value2, ..., (SELECT MAX(Spalte9)+1 FROM tabelle WHERE sowiso))
Wie dem auch sei... Dieses Statement funktioniert solange bis ich bei MAX() eine 0 erwarte und NULL bekomme... Warum NULL (bzw. EMPTY, aber das stellt mich vor das gleiche Problem) drin steht ist mir dabei schon klar, aber wie bekomme ich eine Zero? Jemand ne Idee? P.S.: Generell habe ich nichts gegen den Einsatz von Stored Procedures, aber keinen Plan wie ich da ran gehen soll... Da diese Datenbank sehr Komplex ist und auch mehere Programme auf die Datenbank zugreifen und weiterhin unabhängig voneinander arbeiten müssen mag ich nicht zu viel dran tunen... MfG Tonic |
Re: SQL: NULL+1 ... So geht das nicht...
Ich bin nicht sicher, ob case bei Interbase funktioniert. Bei MSSQL würds jedenfalls so gehen ( denke ich ;) ):
SQL-Code:
Kannste ja mal versuchen.
Select case when Max( Spalte9 ) is null then 0 else Max( Spalte9 ) + 1 end
Wenn das 0 auch um 1 inkrementiert werde soll, musst du natürlich statt der 0 ne 1 reinschreiben. |
Re: SQL: NULL+1 ... So geht das nicht...
Moin...
Danke für den hinweis Treffnix, aber ich bekomme ein unknown Token bei "when". Ich war in meiner Recherche bevor ich diesen Thread gestartet habe schon auf "case" gestoßen. Wenn aber erst bei "when" der fehler kommt, sollte man meinen, dass es eine alternative Syntax gibt. Dazu habe ich allerdings noch nix gefunden. MfG Tonic |
Re: SQL: NULL+1 ... So geht das nicht...
Guten Morgen,
ich kenne IB nicht, aber bei Access kann man die Funtkion nz() und beim MS-SQLServer isnull() verwenden um einen Ersatzwert für die Null zu bekommen. select nz(ProblemFeld, 0) + 1 .... so was dürfte es bei IB auch geben. Schönen Tag Niels |
Re: SQL: NULL+1 ... So geht das nicht...
Hallo,
ich bin zwar kein IB-Spezi, aber der SQL-Standard sieht die Funktion COALESCE vor:
SQL-Code:
ergibt 0, wenn der Wert in <field> NULL ist. Einige Dialekte nennen die Funktion auch VALUE.
select coalesce (<field>,0) ...
Hoffe, es hilft... Peter |
Re: SQL: NULL+1 ... So geht das nicht...
Ich verwende in solchen Fällen einfach eine externe Funktion (bei Firebird sind schon einige dabei ...)
schau mal nach, ob im IB unter ExternalFunction welche drinnen sind, die einen Integer nicht ändern z.B.: Floor, Abs, Ceiling oder sonst was. und dann einfach SELECT FIELD1, Ceiling(Field2) FROM ... gruss hans [Edit] aber das von PRehders funktioniert zumindest unter FB auch, und die Funktion sieht etwas professioneller aus ... [/Edit] |
Re: SQL: NULL+1 ... So geht das nicht...
ich denke, das o.g. "COALESCE" ist Deine Lösung - alternativ kannst Du noch "IF" versuchen - wird von einigen DB's unterstützt.
Gruß |
Re: SQL: NULL+1 ... So geht das nicht...
Hi...
Danke für die Zahlreichen Tips. Das meisste davon hatte ich auch schon recherchiert. Leider bin ich bislang nicht zu einer passenden Lösung des Problems gekommen. Ich habe mir daher eine Datei mit UDF's aud dem Netz geladen. Leider ist das für mich völliges Neuland. Ich habe laut anweisund der installationsdatei (gebrochenes englisch :roll: ) nur die Datei (für Linux mit IB6) in das Verzeichnis /opt/interbase/UDF kopiert und den interbase-Server (nicht die ganze maschiene) neu gestartet. Leider kennt er die Funktionen, die in dieser datei hinterlegt sind immer noch nicht. Daher meine Vermutung: Liegt mein Problem vielleicht ganz woanders? SQL-Dialect? Liegts an der Komponente TSQLConnection? Vielleicht an ExecuteDirect, dass ich benutze? UDF falsch installiert? Bin ich einfach zu dämlich? :pale: Auch Funktionen wie NZ, COALESCE und CASE WHEN... kennt er ja nicht, die es (zumindest teilweise) ja geben müsste. Ich habe jetzt die Funktion Z (gibt 0 statt NULL zurück) aus meiner UDF angesprochen mit dem selben Resultat. Gibt es da noch einen Trick? Gebt mir auch ruhig Antworten für Noobs... Kann diesmal nicht schaden :lol: :lol: Danke schonmal... |
Re: SQL: NULL+1 ... So geht das nicht...
Hi...
Alles klar, IB für Fortgeschrittene. Für alle, die in Zukunft mal das gleiche Problem haben: UDFs müssen mit DECLARE und Einsprungpunkt (die DLL mit Dateiname) angemeldet werden. Ansich logisch, aber doch ein wenig undurchsichtig. Danke an alle... Ich benutze jetzt die Funktion Z() aus der UDF MfG Tonic |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz