Announcement

Collapse
No announcement yet.

Bedingung: Bestimmte Anzahl von Wortvorkommen in String

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

  • Bedingung: Bestimmte Anzahl von Wortvorkommen in String

    Hallo zusammen,

    ich hab Probleme folgende Abfrage zu bauen (Oracle SQL Developer)

    Ich will in einem bestimmten String zählen wie oft ein Wort vorkommt und dies als Bedingung setzen mir nur die Datensätze anzuzeigen die dies erfüllen.
    Beispiel:

    select A.Typ, B.Zeit
    from t_tabelle1 A, t_tabelle2 B
    where A.ID = B.ID
    and count(B.STRING like '%unit%') = '2'

    d.h. aus der Tabelle B im Feld String darf das Wort "unit" insgesamt nur zweimal vorkommen. Als Fehlermeldung bekomme ich hier "Group function is here not allowed"

    Danke schon mal für die Hilfe

  • #2
    Hallo,

    mir fällt dazu so etwas ein:

    Code:
    WITH a AS (SELECT 'abcabcabc' d FROM dual
               UNION ALL
               SELECT 'abcabc' FROM dual
               UNION ALL
               SELECT 'xbc' FROM dual)
    SELECT a.d FROM a
    WHERE (LENGTH(d)-LENGTH(REPLACE(d,'bc')))/LENGTH('bc')=2
    ;
    Gruß

    Ralf

    Comment


    • #3
      Ab ORACLE 11 gibt es dafür die Funktion regexp_count:

      Code:
      WITH 
       t_tabelle2 AS 
         (SELECT 1 id, 'abcabcabc' str FROM dual UNION ALL
          SELECT 2,    'abcabc'        FROM dual UNION ALL
          SELECT 3,    'xbc'           FROM dual)
      SELECT id, str FROM t_tabelle2 
      WHERE REGEXP_COUNT(str, 'bc' )=2;
      
              ID STR      
      ---------- ---------
               2 abcabc

      Comment


      • #4
        Danke schon mal für die Antworten. Leider habe ich das nicht so hinbekommen, weil es mir bei der ersten Lösung an SQL Erfahrung fehlt und bei der zweiten Antwort unterstützt meine Oracle Version den Befehl REGEXP_COUNT nicht.

        Ich habe aber nun INSTR für mich entdeckt und habe die Abfrage wie folgt zusammen gebastelt:

        SELECT ...
        FROM ...
        WHERE ...
        AND ...
        AND INSTR(b.result, 'unit') < 3

        Jetzt habe ich aber da das Problem, dass ich alle Ergebnisse bekomme in denen in dem String b.result das Wort "unit" kein mal, einmal oder zweimal enthalten ist. Jetzt würde ich gern eine Unterabfrage machen das aus diesem Ergebnis mir nur noch die Einträge anzeigt in denen das Wort "unit" öfters als einmal vorkommt um die Einträge mit genau zweimaligem Vorkommen zu bekommen, aber leider weiß ich nicht wie ich die Unterabfrage bauen muss. Kann mir da vielleicht jemand helfen? Danke schon mal.

        Viele Grüße

        Comment


        • #5
          Wenns nur 2 mal sein sollen geht auch:

          Code:
          SELECT ...
          FROM ...
          WHERE ...
          AND ...
          AND INSTR(b.result, 'unit') = 2
          Zwischen 2 und 4 mal:

          Code:
          SELECT ...
          FROM ...
          WHERE ...
          AND ...
          AND INSTR(b.result, 'unit') < 5
          AND INSTR(b.result, 'unit') > 1
          Wenn die Rechenzeit im unteren Beispiel zu lang dauert, dann könnte man das INSTR auch in ein SubSelect auslagern.
          Zuletzt editiert von fanderlf; 04.03.2010, 11:21.

          Comment


          • #6
            Hallo,

            Originally posted by Aazdor View Post
            Danke schon mal für die Antworten. Leider habe ich das nicht so hinbekommen, weil es mir bei der ersten Lösung an SQL Erfahrung fehlt
            Was verstehst du jetzt daran nicht?
            Code:
            SELECT a.d FROM a
            WHERE (LENGTH(d)-LENGTH(REPLACE(d,'bc')))/LENGTH('bc')=2
            Von der Gesamtlänge der Zeichenkette wird die Länge nach dem Rauswerfen des gesuchten Ausdrucks abgezogen und das Ergebnis, z.B. 4, durch die Länge des Suchbegriffs (z.B.2) geteilt. Wenn das Ergebnis 2 ist dann war der Ausdruck zwei Mal da.

            Ich habe aber nun INSTR für mich entdeckt und habe die Abfrage wie folgt zusammen gebastelt:
            INSTR gibt dir zurück, an welcher Stelle dein Suchbegriff in der Zeichenkette auftaucht und ist damit wohl hier nicht richtig am Platz.

            Gruß

            Ralf

            Comment


            • #7
              Ok, verstanden ;-)
              Hat funktioniert. Vielen Dank

              Comment

              Working...
              X