AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi SQL: NULL+1 ... So geht das nicht...
Thema durchsuchen
Ansicht
Themen-Optionen

SQL: NULL+1 ... So geht das nicht...

Ein Thema von Tonic1024 · begonnen am 8. Okt 2004 · letzter Beitrag vom 11. Okt 2004
Antwort Antwort
Benutzerbild von Tonic1024
Tonic1024

Registriert seit: 10. Sep 2003
Ort: Cuxhaven
559 Beiträge
 
RAD-Studio 2009 Ent
 
#1

SQL: NULL+1 ... So geht das nicht...

  Alt 8. Okt 2004, 15:20
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:

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

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
Der frühe Vogel fängt den Wurm, richtig.
Aber wird nicht auch der frühe Wurm vom Vogel gefressen?
  Mit Zitat antworten Zitat
Benutzerbild von Treffnix
Treffnix

Registriert seit: 25. Jun 2003
Ort: AC
740 Beiträge
 
Delphi 7 Professional
 
#2

Re: SQL: NULL+1 ... So geht das nicht...

  Alt 8. Okt 2004, 16:03
Ich bin nicht sicher, ob case bei Interbase funktioniert. Bei MSSQL würds jedenfalls so gehen ( denke ich ):

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.
  Mit Zitat antworten Zitat
Benutzerbild von Tonic1024
Tonic1024

Registriert seit: 10. Sep 2003
Ort: Cuxhaven
559 Beiträge
 
RAD-Studio 2009 Ent
 
#3

Re: SQL: NULL+1 ... So geht das nicht...

  Alt 11. Okt 2004, 07:37
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
Der frühe Vogel fängt den Wurm, richtig.
Aber wird nicht auch der frühe Wurm vom Vogel gefressen?
  Mit Zitat antworten Zitat
nieurig

Registriert seit: 26. Apr 2004
113 Beiträge
 
Delphi 6 Professional
 
#4

Re: SQL: NULL+1 ... So geht das nicht...

  Alt 11. Okt 2004, 07:47
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
Erspare Dir die Gedanken über ungelegte Eier !!!
  Mit Zitat antworten Zitat
PRehders

Registriert seit: 31. Okt 2003
Ort: Hamburg
42 Beiträge
 
#5

Re: SQL: NULL+1 ... So geht das nicht...

  Alt 11. Okt 2004, 07:49
Hallo,
ich bin zwar kein IB-Spezi, aber der SQL-Standard sieht die Funktion COALESCE vor:

select coalesce (<field>,0) ... ergibt 0, wenn der Wert in <field> NULL ist. Einige Dialekte nennen die Funktion auch VALUE.

Hoffe, es hilft...

Peter
Peter Rehders
Man sollte niemanden ernst nehmen, der sich ernst nimmt.
  Mit Zitat antworten Zitat
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.426 Beiträge
 
Delphi 2007 Professional
 
#6

Re: SQL: NULL+1 ... So geht das nicht...

  Alt 11. Okt 2004, 08:01
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]
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#7

Re: SQL: NULL+1 ... So geht das nicht...

  Alt 11. Okt 2004, 09:10
ich denke, das o.g. "COALESCE" ist Deine Lösung - alternativ kannst Du noch "IF" versuchen - wird von einigen DB's unterstützt.
Gruß
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat
Benutzerbild von Tonic1024
Tonic1024

Registriert seit: 10. Sep 2003
Ort: Cuxhaven
559 Beiträge
 
RAD-Studio 2009 Ent
 
#8

Re: SQL: NULL+1 ... So geht das nicht...

  Alt 11. Okt 2004, 09:30
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 ) 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?

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

Danke schonmal...
Der frühe Vogel fängt den Wurm, richtig.
Aber wird nicht auch der frühe Wurm vom Vogel gefressen?
  Mit Zitat antworten Zitat
Benutzerbild von Tonic1024
Tonic1024

Registriert seit: 10. Sep 2003
Ort: Cuxhaven
559 Beiträge
 
RAD-Studio 2009 Ent
 
#9

Re: SQL: NULL+1 ... So geht das nicht...

  Alt 11. Okt 2004, 09:45
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
Der frühe Vogel fängt den Wurm, richtig.
Aber wird nicht auch der frühe Wurm vom Vogel gefressen?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:33 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