User Defined Funktion und like
- Dieses Thema hat 7 Antworten und 1 Teilnehmer, und wurde zuletzt aktualisiert vor 17 Jahre, 11 Monaten von
Anonym.
-
AuthorPosts
-
7. Oktober 2005 um 8:27 Uhr #2611
AnonymGastHallo zusammen !
Ich habe eine UDF geschrieben die alles in Grossbuchstaben umsetzt (GROSS). Diese gibt einen CHAR(70) zurück.
Bei
SELECT NAME FROM TABELLE WHERE
GROSS(NAME) LIKE GROSS(‚%muel%‘);bekomme ich einen -132.
Kann mir jemand sagen warum ?
Besten Dank
Andreas ???
7. Oktober 2005 um 9:48 Uhr #3041
AnonymInaktivIch glaube nicht, dass UDF’s bei einem LIKE zugelassen sind.
Versuch mal rauszubekommen, ob das Problem links oder rechts vom LIKE liegt:funktioniert eine dieser Where-Abfragen (syntaktisch):
WHERE GROSS(NAME) LIKE ‚AAA‘
WHERE NAME LIKE GROSS(‚AAA‘)auf Grossbuchstaben umsetzen kannst Du auch mit der skalaren Funktion UPPER. Mit der funktioniert der LIKE auf alle Fälle.
also ein
WHERE UPPER(NAME) LIKE UPPER(‚%muel%‘)
sollte gehen
7. Oktober 2005 um 10:24 Uhr #3344
AnonymGastHallo Ulrich !
Das Problem liegt auf der rechten Seite.
Ein UPPER reicht mir nicht, da die Funktion GROSS auch ein ü in UE umsetzen muss.
In dem DB2 Buch von Norbert Denne habe ich gelesen, dass der Like mit dem String Ergebnis einer Funktion funktioniert.
Sind UDF’s davon ausgeschlossen ?
Danke
Andreas
7. Oktober 2005 um 10:57 Uhr #3532
AnonymInaktiv"normale" skalare Funktionen gehen, UDFs habe ich nicht ausprobiert.
Versuch mal ein
WHERE GROSS(name) LIKE CAST(GROSS(‚%mue%‘) AS CHAR(70) )aber normalerweise würde ich den Suchstring sofern möglich ausserhalb des SQLs ( also schon vorher im Programm) aufbereiten und dann nur noch mit
… LIKE aufbereiteter-string abfragen
10. Oktober 2005 um 6:12 Uhr #3663
AnonymGastHallo Andreas,
beim like gibt es starke Einschränkungen, siehe Beschreibung des -132. Z. B. Col1 like Col2 funktioniert meines Wissens auch nicht.
Falls du die Daten vor dem Vergleich erst durch die UDF schickst ist dieses Pred nicht indexable. Wenn du andrere ‚gute‘ Preds hast ist das vielleicht kein Problem, aber man sollte drüber nachdenken.
Evtl. solltest du überlegen eine zweite Col einzurichten, in der du den Namen in Grossbuchstaben speicherst (Pflege z. B. über Trigger). Für den Select kann dann diese Col herangezogen werden, die rechte Seite muss allerdings dann trotzdem im Programm aufbereitet werden.
Schau dir doch auch mal den Thread ‚SQL Umlaute umsetzen‘ an!MfG Rolf
10. Oktober 2005 um 6:56 Uhr #3758
AnonymGastHallo !
Das kein Index benutzt wird ist mir klar.
Da es sich hier im konkreten Fall aber nur um sehr kleine Datenmengen handelt (ca. 1000 Sätze) will ich es mal vernachlässigen.Ich bereite die User-Eingabe nun wie vorgeschlagen im Programm mit:
Select GROSS(USER-EINGABE) FROM SYSIBM.SYSDUMMY1 INTO W-SUCH
auf.
Besten Dank für die Antworten
Andreas
10. Oktober 2005 um 7:59 Uhr #3820
AnonymInaktivEine SET – Anweisung sollte eigentlich auch funktionieren:
EXEC SQL
SET :W-SUCH = GROSS ( :USER-EINGABE )das würde Dir einen Tablespace-Scan ersparen
12. Oktober 2005 um 10:14 Uhr #3860
AnonymGastDanke, gute Idee !
Bis dann
Andreas
-
AuthorPosts
You must be logged in to reply to this topic.