PDA

View Full Version : SQL - Datentyp



loeweadolf
21-09-05, 22:09
In einem SQL-Trigger in einer WHERE-Anweisung möchte ich ein Datenfeld (numeric(6, 0)) mit den ersten 6 Stellen eines CHAR-Feldes vergleichen (dessen ersten 6 Stellen Ziffern sind).

Die Abfrage lautet:
.. where aiqual = int(substring(neu.ararti, 1, 6))

oder in einem anderen Versuch
.. where aiqual = decimal(substring(neu.arti, 1, 6), 6, 0)

Beide Versionen funktionieren.

Im JOBLOG wird allerdings jedesmal folgendes gesagt:
- Auswahlfeldern anderen Attributen zugeordnet
- Datentyp, Anzahl Stellen, Dezimalstelle oder Feldlänge
geändert in: AIQUAL damit das Feld vrglichen werden konnte
- Es kann kein Zugriffspfad zur Verarbeitung der Auswahl
verwendet werden, da kein Schlüsselfeld über entspr.
Attribute verfügt

Ich habe nun Bedenken, dass im Echtbetrieb eine schlechte Performance entstehen kann wg. fehlendem Zugriffspfad.

Kann die Vergleichsabfrage anders gestaltet werden ?

mfg Ludger

Fuerchau
22-09-05, 12:31
Wenn Attribute in einer Where-Bedingung geändert werden, gibt es halt diesen Warnhinweis, dass ggf. Performanceverluste auftreten.
Allerdings dürfte obige Meldung nur im DEBUG-Modus auftreten, sonst würde im laufenden Betrieb das Joblog ziemlich schnell volllaufen.

Wenn du einen SQL-Trigger machst, kannst du die beiden Felder doch über Hilfsvariablen vergleichen.

Es ginge ggf. noch der Vergleich:
... where digits(aiqual) = substr(neu.arti, 1, 6) ...

was allerdings die Fehlermeldung nicht unterdrückt.

Alternativ kannst du eine View erstellen, in der "aiqual" bereits als "digits(aiqual) as aiqual)" umformatiert ist.
Oder eine LF mit berenchneten Feldern, die nur die relevanten Felder enthält sowie das umformatierte "aiqual".

loeweadolf
22-09-05, 13:20
Hallo Baldur, danke für die Antwort.

Ich habe inzwischen schon selber weitergesucht und die Variante mit den Hilfsvariablen (so wie du auch beschrieben hast) verwendet:

declare qualitaet numeric(6, 0);
set qualitaet = decimal(substring(neu.ararti, 1, 6), 6, 0);

... where aiqual = qualitaet


Es ist richtig, dass die Fehlerhinwesie nur im DEBUG-Modus ersichtlich sind.

mfg. Ludger