Announcement

Collapse
No announcement yet.

Varchars mathematisch vergleichen ?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Varchars mathematisch vergleichen ?

    Hallo Forum,

    folgendes Problem:

    Ich habe in meiner Oracle eine nach Monaten partitionierte Tabelle. Die Partitionsnamen im Systemview unterliegen folgender Konvention <B>FCD_200304</B> (für Daten vom April 2003). Also zuerst immer der String FCD_ und danach der entsprechende Monat.

    Ich brauche nun eine Abfrage auf diesen Systemview die mir alle Partitionsnamen kleiner als ein übergebener Monat zurückliefert. Beispielsweise:

    Variable geliefert: 200212

    SQL Return:

    FCD_200208
    FCD_200209
    FCD_200210
    FCD_200211

    Ich will also diese VARCHAR2 Felder "mathematisch" mit kleiner als vergleichen. Bisher konnte ich leider nur mit einem "like '%200304'" genau einen Partitionsnamen bekomme, aber nicht alle die kleiner als 200304 sind.

    Ich hoffe ich habe mich einigermassen verständlich ausgedrückt.

    Danke schonmal,
    Robert

  • #2
    Unter ORACLE ginge das so:

    to_number(SUBSTRING('FCD_200208', 5)). Dann ist das Ergebnis eine Zahl, mit der man wieder rechnen kann.

    Vergleichbare Operationen gibt es sicher in anderen DBMS.

    Gruss

    Stefa

    Comment


    • #3
      Hallo Stefan,

      mit To_Number und Substrings habe ich es auch schon probiert.

      Die Abfrage vorher lautete:

      <b>SELECT PARTITION_NAME FROM USER_TAB_PARTITIONS<br>
      WHERE Table_Name = 'PARTITIONIERTE_TABELLE'<br>
      AND PARTITION_NAME like '%200303'</b>

      Da bekan ich dann genau 1 Partition zurück. So weit so gut.

      Ich habe dann das hier versucht

      <b>SELECT PARTITION_NAME FROM USER_TAB_PARTITIONS<br>
      WHERE Table_Name = 'PARTITIONIERTE_TABELLE'<br>
      AND TO_NUMBER(SUBSTR(PARTITION_NAME,5)) < 200303</b>

      Aber da sagt mir Oracle "invalid number" und markiert das Wort "PARTITION_NAME" in der letzten Zeile.

      (

      Rober

      Comment


      • #4
        Hab den Wald vor lauter Bäumen nicht gesehen. Die Lösung ist ganz einfach:

        <b>
        SELECT PARTITION_NAME FROM USER_TAB_PARTITIONS<br>
        WHERE Table_Name = 'PARTITIONIERTE_TABELLE'<br>
        AND PARTITION_NAME < '200303'</b>

        So funktioniert es. Danke trotzdem.

        Rober

        Comment


        • #5
          Also wenn da invalid number steht, dann kann ORACLE den String nicht umwandeln, weil da was drin ist, das keine Zahl ist. z.B. TO_NUMBER('__09') gibt ne Fehlermeldung, weil __ nicht umgewandelt werden kann. Ich wuerde mal das Ergebnis des SUBSTR-Kommandos in die SELECT-Liste aufnehmen und gucken, was da rauskommt. Vielleicht ist da noch irgendein Zeichen, das nicht umgewandelt werden kann. NULL ist ebenfalls kritisch.

          Dein neuer Versuch kann meiner Meinung nach nicht funktionieren. Der Vergleich geht rein alphabetisch vor sich. ABC ist demnach kleiner als BBC. Möglicherweise sind Buchstaben immer kleiner als jede Ziffer. Das wuerde erklaeren, warum dein Test funktioniert. Wuerde ich auch mal mit SELECT 'HALLO' FROM dual WHERE 'FCD_200304' < 200303. Das duerfte ja eigentlich kein Ergebnis liefern, weil ja 200304 nicht kleiner ist 200303. Wenn doch, dann sind Buchstaben immer kleiner. Die Methode mit dem SUBSTRING scheint mir irgendwie vielversprechender.

          Gruss

          Stefa

          Comment


          • #6
            Hallo Stefan,

            Wieder mein Fehler. Ich vergleiche in der Abfrage natürlich nicht wie oben geschrieben so:

            <b>AND PARTITION_NAME < '200303' </b>

            sondern so:

            <b>AND PARTITION_NAME < 'FCD_200303' </b>

            Da alle Partitionsnamen mit FCD_ anfangen, wird letzendlich doch nur die Monatszahl verglichen. Also haut das Ding hin...jedenfalls solange die Partitionsnamen der Konvention FCD_MONAT folgen.

            Wie gesagt, klappt dein Vorschlag mit dem Substr nicht, weil zuerst die Typkonvertierung To_Number greift, und danach erst der Substring geholt werden soll. Da aber der String FCD_ nicht in eine Zahl umgewandelt werden kann, klappt die Abfrage so leider nicht.

            Danke trotzdem nochmal,

            Rober

            Comment

            Working...
            X