PDA

View Full Version : embedded sql substring



tarkusch
27-06-14, 13:43
Hallo,

ich möchte mit Sql prüfen ob ein Kundenname schon vergeben worden ist.
Leider ist mein Vergleichsfeld grösser.

Ist es möglich hier ein Substring zu verwenden?

Habe es wie folgt probiert aber hat nicht geklappt:


EXEC SQL
SELECT COUNT(*)
INTO :COUNT :MyIndikator
FROM KUNDENP
WHERE K1NAM = :(%SUBST(F8:1:27));


Dank im Voraus

Tarki

Fuerchau
27-06-14, 13:57
Eine Hostvariable wird immer mit Doppelpunkt eingeleitet, also:
WHERE K1NAM = %SUBST(:F8, 1, 27)
Außerdem werden Parameter in SQL durch Kommata getrennt.
Die Größe des Vergleichsfeldes spielt keine Rolle, da SQL bei Zeichenfeldern immer rechts Leerzeichen annimmt.

tarkusch
27-06-14, 13:59
Danke vielmals und wieder was gelernt.

tarkusch
27-06-14, 14:05
Eine Hostvariable wird immer mit Doppelpunkt eingeleitet, also:
WHERE K1NAM = %SUBST(:F8, 1, 27)
Außerdem werden Parameter in SQL durch Kommata getrennt.
Die Größe des Vergleichsfeldes spielt keine Rolle, da SQL bei Zeichenfeldern immer rechts Leerzeichen annimmt.

Ich hätte da noch eine Frage zu: "Größe des Vergeleichfeldes spielt keine Rolle, ..'

Wie ist das gemein? Beispiel unten stimmt ja bis zu einer bestimmten länge überein dann nicht mehr.
Ich dachte mir wenn ich mit Substring arbeite dann bin ich auf der richtigen Seite
F1NAM = 'FA. GRUBER UND HAUSER'
F8 = 'FA. GRUBER UND HAUSER UND SÖHNE'

B.Hauser
27-06-14, 14:22
%SUBST ist RPG und nicht SQL!
Entweder Du legst Dir eine Host-Variable zu in der nur die ersten 27 Zeichen von F8 stehen oder Du must den Substring mit der entsprechenden SQL-Funktion machen:

... WHERE K1NAM = SUBSTR(:F8, 1, 27)

oder
... WHERE K1NAM = Left(:F8, 27)

Kleine Anmerkung die bessere Lösung ist auf alle Fälle die zusätzliche Host-Variable.

Birgitta

Fuerchau
27-06-14, 14:41
Was den Vergleich angeht ist dein Konzept wohl falsch.
Wenn dein DB-Feld kleiner ist als dein Herkunftsfeld ist die Wahrscheinlichkeit eines Treffers sowieso geringer. Außerdem reicht ein Leerzeichen mehr oder eine leicht andere Schreibweise aus, "Dubletten" nicht zu finden, von Groß-/Kleinschreibung ganz abgesehen.

Kleine Schreibfehler seihen mir bitte verziehen:).

Pikachu
27-06-14, 16:29
Wenns nicht übermäßig viele Datensätze sind, wär vielleicht auch ein SQL-LIKE mit % direkt vor und nach dem Vergleichswert möglich.

BenderD
29-06-14, 15:12
... für sowas gibt es unscharfe Suchalgorithmen wie SOUNDEX, der sogar als SQL Function implementiert ist (sollte man aber modifizieren, damit er Umlaute und Ligaturen vernünftig behandelt).

D*B