[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    Registriert seit
    Feb 2009
    Beiträge
    12
    Nun noch eine Frage, zum LIKE, CAST und CCSID 1200.

    Wenn mein SQL "....where UPPER(cast(TITITL as graphic(60) ccsid 1200)) like cast('%TOP%' as graphic(60) ccsid 1200) " lautet, bekomme ich nur den Titel der genau TOP heißt. Andere Titel in der Tabelle die z.B. "stops" enthalten werden nicht angezeigt.
    Meine Vermutung läuft dahin dass das '%' nicht in im Cast sein darf.
    Aber wie lautet der String dann? Mit
    Code:
    select * from  MDPROP03                                    
    where upper(cast(TITITL as graphic(60) ccsid 1200))        
    like ('%'||cast('TOP'  as graphic(60) ccsid 1200)||'%')    
    SELECT * FROM MDPROP03 
    WHERE upper(cast(TITITL as graphic(60) ccsid 1200)) 
    like '%' CONCAT cast('TOP' as graphic(60) ccsid 1200) 
    CONCAT '%'
    bekomme ich das gleiche Ergebnis.

  2. #2
    Registriert seit
    Mar 2002
    Beiträge
    5.379
    select ... where ... like ?
    preparen und anchließend open ... using :myHostVar
    sollte da eigentlich funzen, dann fällt die UCS Casterei wieder weg und myHostVar muss dann ein graphic Feld sein.

    D*B

    Zitat Zitat von tsh1970 Beitrag anzeigen
    Nun noch eine Frage, zum LIKE, CAST und CCSID 1200.

    Wenn mein SQL "....where UPPER(cast(TITITL as graphic(60) ccsid 1200)) like cast('%TOP%' as graphic(60) ccsid 1200) " lautet, bekomme ich nur den Titel der genau TOP heißt. Andere Titel in der Tabelle die z.B. "stops" enthalten werden nicht angezeigt.
    Meine Vermutung läuft dahin dass das '%' nicht in im Cast sein darf.
    Aber wie lautet der String dann? Mit
    Code:
    select * from  MDPROP03                                    
    where upper(cast(TITITL as graphic(60) ccsid 1200))        
    like ('%'||cast('TOP'  as graphic(60) ccsid 1200)||'%')    
    SELECT * FROM MDPROP03 
    WHERE upper(cast(TITITL as graphic(60) ccsid 1200)) 
    like '%' CONCAT cast('TOP' as graphic(60) ccsid 1200) 
    CONCAT '%'
    bekomme ich das gleiche Ergebnis.
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.755
    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) !
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.755
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  5. #5
    Registriert seit
    Feb 2009
    Beiträge
    12
    okay das wars, vielen Dank
    mit folgenden Select klappts zu voller Zufriedenheit:
    Code:
    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.

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.755
    Zu beachten ist aus Performancegründen dass Funktionen auf Felder in der Where-Klauses wie UPPER, CAST u.ä. die Verwendung eines Indexes verhindern.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  7. #7
    Registriert seit
    Mar 2002
    Beiträge
    5.379
    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

    Zitat Zitat von Fuerchau Beitrag anzeigen
    Zu beachten ist aus Performancegründen dass Funktionen auf Felder in der Where-Klauses wie UPPER, CAST u.ä. die Verwendung eines Indexes verhindern.
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  8. #8
    Registriert seit
    Feb 2009
    Beiträge
    12
    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.

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.755
    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);
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  10. #10
    Registriert seit
    Aug 2001
    Beiträge
    2.934
    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.

    PHP-Code:
    exec sql 
    declare MyCursor Cursor for
    select ....
    where Field like '%' concat Trim(:HostVarconcat '%'
    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

Similar Threads

  1. RPGLE - SQL
    By christian_lettner in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 16-11-06, 11:15
  2. SQL - Cursor vernichten ?!?
    By FNeurieser in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 11-10-06, 15:53
  3. SQL und OBJLCK
    By malzusrex in forum IBM i Hauptforum
    Antworten: 8
    Letzter Beitrag: 19-09-06, 12:04
  4. SQL - Fehler
    By Kaufmann in forum IBM i Hauptforum
    Antworten: 11
    Letzter Beitrag: 28-06-06, 15:11
  5. SQL .. for update of (RPG embedded SQL)
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 01-06-06, 10:43

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •