View Full Version : emb. SQL und UTF-16
Das Problem beim casten ist die fixe Länge an stelle von VARGRAPHIC bzw. VARCHAR.
Dadurch wird rechstbündig mit Leerzeichen aufgefüllt, die natürlich zum Suchmuster dazugehören.
AUch bei Hostvariablen ist ggf. die Definition varying erforderlich oder im SQL ein trim(: MyHstVar) !
Nachtrag:
Wenn du ohne Hostvars arbeitest und deinen SQL zusammenstrickst, wird das Ganze nur mit invarianten Zeichen in den Konstanten korrekt funktionieren.
Umlaute und andere Sonderzeichen werden Probleme bereiten.
Einzig die Verwendung einer UCS2-Hostvariablen als Parameter wird sicher über alle Sprachgrenzen hinweg funktionieren.
okay das wars, vielen Dank :cool:
mit folgenden Select klappts zu voller Zufriedenheit:
select * from MDPROP03
where upper(cast(TITITL as graphic(60) ccsid 1200))
like trim(cast('%TOP%' as graphic(60) ccsid 1200))
Eine Umstellung auf HostVars werde ich nun als nächstes in Angriff nehmen.
Zu beachten ist aus Performancegründen dass Funktionen auf Felder in der Where-Klauses wie UPPER, CAST u.ä. die Verwendung eines Indexes verhindern.
a) dös is hier Wurscht (like %irgendwas führt eh zum full table scan)
b) wat mutt dat mutt
c) eine halbwegs intelligente Query Engine sollte sich da (hoffentlich) ratz fatz den erforderlichen Zugriffspfad von einem (hoffentlich) vorhandenen Index ableiten können.
D*B
Zu beachten ist aus Performancegründen dass Funktionen auf Felder in der Where-Klauses wie UPPER, CAST u.ä. die Verwendung eines Indexes verhindern.
Habe da Programm nun auf Hostvar umgestellt und es funktioniert wunderbar mit Sonderzeichen, Kyrillisch und Chinesisch.
Das einzige was mich etwas erstaunt hat war, das die erste Hostvar nicht mit LIKE verwendet werden darf.
Sondern das z.B. erst ein direkter Vergleich mit einem Tabelleninhalt erfolgen muss und dann das Like mit HostVar folgen darf.
Warum auch immer? Es funktioniert jetzt wie gewünscht.
Vielen Dank für eure Hilfe.
Like mit Hostvar verwende ich regelmäßig.
Dazu 2 Varianten:
D MyLikeVar s 100 varying
D My2LikeVar s 100
MyLikeVar = '%' + %trim(Irgendwas) + '%';
// direkte Verwendung in Like möglich
exec sql
declare MyCursor Cursor for
select ....
where Field like : MyHostVar;
My2LikeVar = '%' + %trim(Irgendwas) + '%';
// hier stehen Leerzeichen am Ende
exec sql
declare MyCursor Cursor for
select ....
where Field like trim(: My2HostVar);
Hier noch eine 3. Variante:
Es ist völlig egal, ob die Hostvariable fixe oder variable Länge hat oder ob am Anfang oder Ende noch irgendwelche *Blanks rumstehen. Achso und die Prozentzeichen muss man auch nicht in den String reinpfriemeln.
exec sql
declare MyCursor Cursor for
select ....
where Field like '%' concat Trim(:HostVar) concat '%';
Birgitta