Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL: NULL+1 ... So geht das nicht... (https://www.delphipraxis.net/31402-sql-null-1-so-geht-das-nicht.html)

Tonic1024 8. Okt 2004 16:20


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:
INSERT INTO tabelle (Spalte1, Spalte2, ..., Spalte9) VALUES (Value1, Value2, ..., (SELECT MAX(Spalte9)+1 FROM tabelle WHERE sowiso))
Ich hab es aus dem Gedächtnis rekostruiert, hoffe da ist nun kein Fehler drin :stupid:

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

Treffnix 8. Okt 2004 17:03

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:
Select case when Max( Spalte9 ) is null then 0 else Max( Spalte9 ) + 1 end
Kannste ja mal versuchen.
Wenn das 0 auch um 1 inkrementiert werde soll, musst du natürlich statt der 0 ne 1 reinschreiben.

Tonic1024 11. Okt 2004 08:37

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

nieurig 11. Okt 2004 08:47

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

PRehders 11. Okt 2004 08:49

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:
select coalesce (<field>,0) ...
ergibt 0, wenn der Wert in <field> NULL ist. Einige Dialekte nennen die Funktion auch VALUE.

Hoffe, es hilft...

Peter

Gruber_Hans_12345 11. Okt 2004 09:01

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]

Leuselator 11. Okt 2004 10:10

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ß

Tonic1024 11. Okt 2004 10:30

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...

Tonic1024 11. Okt 2004 10:45

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