Wörterzählen

Hallo,

ich arbeite mit Oracle und suche nach einer Abfragemöglichkeit, die auf der Wörteranzahl in einer bestimmten Spalte basiert … habe schon alle möglichen Hilfeseiten durchforst, aber noch keine Möglichkeit gefunden … Danke

ungefähr so:
select *
from abc
where wörteranzahl(spalte xy)>20

chaozz

ich arbeite mit Oracle und suche nach einer
Abfragemöglichkeit, die auf der Wörteranzahl in einer

where wörteranzahl(spalte xy)>20

Ich glaube in MySql heißt das so:
where sum(xy)>20

Gruß SL

chaozz

die anzahl der eintraege einer spalte kriegst du mit

count(spalte)

evtl noch mit

distinct

weitereingrenzen.

ich weiss aber nicht, ob das oracle-syntax ist.

zur not machst du vorher eine abfrgae, mit der du alle zeilen triffst, von der du aber nur die anzahl der ergebnisse nutzt.
( performance ist egal :wink: )

Wörterzählen gelöst…
Hi,

Oracle stellt keine Funktion zur Verfügung, die die Wörter in einem Textstring sucht… muss man also selbst in PL/SQL programmieren - hab ich mal schnell für dich gemacht:

CREATE OR REPLACE
FUNCTION WORDCOUNT (
 i\_String IN VARCHAR2
) RETURN NUMBER
IS
 v\_pos NUMBER;
 v\_InWhiteSpace BOOLEAN := TRUE;
 v\_wordcount NUMBER := 0;
BEGIN
 ------------------------------------------------------------------------------
 -- MODUL : WORDCOUNT
 -- AUTOR : Bernhard Schaefers
 -- BESCHR: Zählt Wörter in einem String. Worttrenner sind: Blank, Komma,
 -- Semikolon, Punkt, Fragezeichen, Bindestrich, Tab, cr, nl
 -- RETURN: Anzahl Wörter
 ------------------------------------------------------------------------------
 IF i\_String IS NULL THEN
 RETURN 0;
 END IF;

 FOR v\_pos IN 1 .. LENGTH (i\_String) LOOP
 IF SUBSTR (i\_String, v\_pos, 1) IN (' ', ',', ';', '.', '?', '-',
 CHR(9) /\* tab \*/, CHR(13) /\* cr \*/, CHR(10) /\* nl \*/)
 THEN
 v\_InWhiteSpace := TRUE;
 ELSIF v\_InWhiteSpace THEN
 v\_InWhiteSpace := FALSE;
 v\_wordcount := v\_wordcount + 1;
 END IF;
 END LOOP;

 RETURN v\_wordcount;
END WORDCOUNT;
/

Diesen Code mit cut&paste in SQL*Plus fallen lassen, dann kann man die Funktion testen:

SELECT WORDCOUNT ('seppel ist doof') FROM DUAL;
SELECT WORDCOUNT ('seppel ist doof wie heu') FROM DUAL;

Bei der Funktion habe ich alle Worttrenner mit aufgenommen, die mir so spontan eingefallen sind - bei Bedarf ergänzen. Noch ein Hinweis: Ein Abfrage der Art

select \* 
from abc 
where WORDCOUNT (spalte\_xy) \> 20

ist nicht performant, da die Funktion WORDCOUNT für jedes Tupel ausgeführt werden muss. Ab Oracle8 gibt jedoch function based indexes, damit lässt sich auch dieses Problem in den Griff kriegen

ciao,
Bernhard