Announcement

Collapse
No announcement yet.

String zerteilen

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

  • String zerteilen

    Habe ein kleines Problem
    Es geht um eine Spalte, die ich zerstücjkelt in 2 anderen Spalten ausgeben möchte
    Beispiel:
    1. Spalte PARAMETER = @GDU-WS011071@Hochfeld@407217@OG-RT 2905@
    2. Spalte PAR_NR soll dann sein = @407217@
    3. Spalte PAR_KFZ soll dann sein= @OG-RT 2905@

    Gelöst habe ich das so:
    Code:
    PARAMETER, SUBSTR(GDURVS.PSIDRUAUFTRAG.PARAMETER,23,8) PAR_NR,
           SUBSTR(GDURVS.PSIDRUAUFTRAG.PARAMETER,30
    geht ja auch, nur das Problem ist, das die länge von der PAR_NR varrieren kann und auch das was davor steht, sodass z.B dies auch mal zu einer solchen Ausgabe führt, dass in NR und KFz nur die hälfte von dem benötigten steht oder so.

    Wie kann ich das EINFACH lösen?
    Gibt es eine Möglichkeit zu sagen das ich den Inhalt ab dem 3. @ bis zum 4. @ haben möchte und so weiter???

  • #2
    Welche ORACLE Version benutzt Du ? Ab Version 10 gibt es "reguläre Ausdrücke", damit kann man solche Aufgaben sehr flexibel lösen, im Beispiel wird das 3. und 4. Auftreten eines Teilstrings beginnend mit "@" gesucht:
    Code:
    WITH params AS
      (  
        SELECT 1 ID, '@GDU-WS011071@Hochfeld@407217@OG-RT 2905@' b FROM DUAL UNION ALL
        SELECT 2   , '@GDU-WA011074@Tiefheim@407218@TH-LI 2906@'   FROM DUAL
      )
      SELECT  b, ID, regexp_substr(b, '(@[^@]+)', 1,3 ) PAR_NR, regexp_substr(b, '(@[^@]+)', 1,4 ) PAR_KFZ 
        FROM params
    gibt
    Code:
    B                                              ID	PAR_NR	  PAR_KFZ
    @GDU-WS011071@Hochfeld@407217@OG-RT 2905@	1	@407217	  @OG-RT 2905
    @GDU-WA011074@Tiefheim@407218@TH-LI 2906@	2	@407218	  @TH-LI 2906
    Zuletzt editiert von jum; 25.09.2009, 12:17.

    Comment


    • #3
      Probier mal dies:

      SUBSTR( GDURVS.PSIDRUAUFTRAG.PARAMETER, INSTR (GDURVS.PSIDRUAUFTRAG.PARAMETER , '@', 1, 3) , INSTR (GDURVS.PSIDRUAUFTRAG.PARAMETER , '@', 1, 4) ) PAR_NR,
      INSTR (GDURVS.PSIDRUAUFTRAG.PARAMETER , '@', 1, 3) liefert die Position, wo '@' das dritte Mal auftritt.
      INSTR (GDURVS.PSIDRUAUFTRAG.PARAMETER , '@', 1, 3) liefert die Position, wo '@' das vierte Mal auftritt.

      kuemmelchen

      Comment


      • #4
        Funktioniert leider so nicht.
        Die Nummer wird zwar ausgeben, das Kennzeichen aber auch noch.
        Bsp: @407291@SO-KR 143@

        Comment


        • #5
          Code:
          SUBSTR( GDURVS.PSIDRUAUFTRAG.PARAMETER, INSTR (GDURVS.PSIDRUAUFTRAG.PARAMETER , '@', 1, 3) , INSTR (GDURVS.PSIDRUAUFTRAG.PARAMETER , '@', 1, 4) ) PAR_NR,  
          SUBSTR( GDURVS.PSIDRUAUFTRAG.PARAMETER, INSTR (GDURVS.PSIDRUAUFTRAG.PARAMETER , '@', 1, 4) , INSTR (GDURVS.PSIDRUAUFTRAG.PARAMETER , '@', 1, 5) ) PAR_KFZ
          kuemmelchen

          Comment


          • #6
            Erstmal danke, also KFZ funktioniert.
            Nur bei der Nummer wird irgendwie auch immer das KFZ noch mit drangehangen

            Comment


            • #7
              Also er scheint den Anfang zu erkennen ab wo er die Zeichen nehmen soll, aber nicht das Ende :\

              Comment


              • #8
                Mit SUBSTR muss die zurückgegebene Länge die Differenz zwischen Pos. 4 und Pos 3 des "@" sein, also:
                Code:
                WITH params AS
                     (
                        SELECT 1 ID, '@GDU-WS011071@Hochfeld@407217@OG-RT 2905@' b  FROM DUAL
                        UNION ALL
                        SELECT 2   , '@GDU-WA011074@Tiefheim@407218@TH-LI 2906@'    FROM DUAL)
                SELECT SUBSTR(b, INSTR(b, '@', 1, 3), INSTR(b, '@', 1, 4) - INSTR(b, '@', 1, 3)) par_nr
                  FROM params 
                
                
                PAR_NR
                ----------
                @407217
                @407218
                analog für PAR_KFZ.
                Spricht eigentlich etwas gegen die flexibleren REGEXP ?

                Comment

                Working...
                X