DB2 locate in Feldtyp LONG VARCHAR

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • DB2 locate in Feldtyp LONG VARCHAR

    Hallo Forum,

    ich versuche mit der "Locate" Funktion in DB2 SQL einen String in einem Datenbankfeld zu finden.
    Dies funktioniert folgendermassen:

    PHP-Code:
    SELECT FROM DBNAME.TABELLENNAME WHERE locate(upper('$suchbegriff'), upper(MA_KEYWORDS)) > 0
    Dies funktioniert auch einwandfrei. Sobald ich aber das Statement mit einer weiteren Suchoption erweitere, geht nichts mehr
    PHP-Code:
    SELECT FROM DBNAME.TABELLENNAME WHERE locate(upper('$suchbegriff'), upper(MA_KEYWORDS)) > OR locate(upper('$suchbegriff'), upper(MA_BESCHREIBUNG)) > 0"; 
    Mittlerweile habe ich festgestellt dass es am Feldtyp LONG VARCHAR liegt.
    Hier scheint es so nicht zu funktionieren. Leider bebötige ich aber diesen,
    da er die einzige Alternative zum MySQL TEXT Feld ist.
    Kann mir jemand sagen wie ich mein Vorhaben trotzdem realisieren kann, ohne den Feldtyp ändern zu müssen.

    Danke und Gruß
    Tolwin

  • #2
    Übrigens ist LONG VARCHAR nur 28 Bytes größer als VARCHAR, aber mit VARCHAR würde es auch nicht funktionieren. Ein geeigneter Datentyp wäre CLOB, siehe unten.

    Aus dem Manual zu LOCATE():
    If the first argument is a character string, the second argument must be a character string. For a VARCHAR, the maximum length is 4 000 bytes, and for a CLOB, the maximum length is 1 048 576 bytes. If the first argument is a binary string, the second argument must be a binary string with a maximum length of 1 048 576 bytes. In a Unicode database, if a supplied argument is a graphic string, it is first converted to a character string before the function is executed. The third argument must be INTEGER or SMALLINT.

    und weiterhin zu LONG VARCHAR:
    The functions in the SYSFUN schema taking a VARCHAR as an argument will not accept VARCHARs greater than 4 000 bytes long as an argument. However, many of these functions also have an alternative signature accepting a CLOB(1M). For these functions, the user may explicitly cast the greater than 4 000 VARCHAR strings into CLOBs and then recast the result back into VARCHARs of desired length.

    Ein anderer Workaround wäre, die 32700 Bytes eines LONG VARCHAR Feldes mit SUBSTR() in jeweils 4000 Bytes zu zerlegen. Dabei mußt du um die 'Nahtstellen' aber nochmals eine Zerlegung machen ((Ende des vorherigen Substrings minus (Länge des Suchwortes minus 1)) plus (Ende des vorherigen Substrings plus Länge des Suchwortes)), sonst würdest du dort evtl. Treffer übersehen, weil der Anfang im vorherigen und das Ende im nächsten Substring steckt. Wenn dir das zu kompliziert klingt, dann caste lieber. Die Query einer solchen Zerlegung ist nämlich noch komplizierter.

    Kommentar


    • #3
      Danke für die umfassende Info!!!
      Habe es heute mit einem Casting hinbekommen - sprich ich caste
      den Long Varchar zum Varchar - dann gehts!

      Vielen Dank und Gruß
      Tolwin

      Kommentar


      • #4
        Okay, wenn es klappt, dann laß es so. Aber ich wundere mich doch sehr, denn für VARCHAR gelten die gleichen Einschränkungen (4000 Bytes).

        Kommentar

        Lädt...
        X