2017-02-16 4 views
0

Ich möchte das längste Wort in einem Varchar2 (in einer Zeichenfolge) in einer Oracle-Abfrage finden. In einigen Situationen würde ich die Zeichenfolge in separate Wörter in einer Tabelle aufteilen, dann könnten Aggregationsfunktionen sie lösen (zB wenn ich max (Länge (mein_Feld) habe, kann ich die längsten Wörter aufspüren.)Finden Sie das längste Wort in einer Zeichenfolge mit Oracle SQL

Aber in dieser Fall ich also nicht diesen Luxus. ich brauche das längste Wort in einem String ohne Aggregation zu berechnen.

ich einen Weg REGEXP_REPLACE verwenden gefunden Worte zu finden, das länger als N Zeichen. Und das ist nicht schlecht. Aber ich . keine Art und Weise mit regex oder anderen Funktionen sieht das längste Wort finden

Hier ist eine vereinfachte Version von dem, was ich verwenden Worte mehr als 4 Zeichen zu finden:

select 
    regexp_replace(
    ' a cd efg hijk lmnop qrst uvw xy z ' 
    , '([^[:alnum:]][[:alnum:]]{1,3}[^[:alnum:]])' 
    , ' ' 
    , 1 
    , 0 
) x 
from dual; 

Aber wie könnte ich nur die längsten Wörter zurückgeben?

+0

Ich kann nur daran denken Teilstring zu verwenden, denn für Regex ist es schwer. – FreedomPride

+1

Die Aufspaltung der Zeichenfolge in Wörter kann Ihre einzige Option sein, wenn Sie planen, dies ohne PL/SQL zu tun. –

+1

Das ist unklar. Wenn mehr als ein Wort am längsten gebunden sind, möchten Sie sie alle zurückgeben? Was ist, wenn Ihre Zeichenfolge alle Wörter der gleichen Länge enthält, sagen wir 7 Zeichen - wie schlagen Sie vor, sie "zurückzugeben", wenn nicht in separaten Zeilen? Also musst du die Saite nicht auseinander brechen? Und was meinst du mit "nicht diesen Luxus"? Welcher Luxus? – mathguy

Antwort

0

Editierte: Leider habe ich Ihre Absicht nicht vollständig gelesen. In Ihrem Fall könnten Sie aus irgendeinem Grund keine Aggregatfunktionen verwenden. Die folgenden Lösungen dienen nur als Referenz. Mit bestem Gruß!

WITH tmp AS 
(
    SELECT 
     regexp_substr(' a cd efg hijk lmnop qrst uvw xy z ','[^ ]+', 1, level) col 
    FROM 
     dual 
    CONNECT BY 
     regexp_substr(' a cd efg hijk lmnop qrst uvw xy z ', '[^ ]+', 1, level) IS NOT NULL 
) 
SELECT 
    col 
FROM 
    tmp 
WHERE 
    length(col) = (SELECT MAX(length(col)) FROM tmp); 
0

Wenn ich gut verstehen, müssen Sie einen Weg, um die längsten Worte zu extrahieren (ein oder mehr) aus einer bestimmten Zeichenfolge ohne eine Tabelle mit Daten zu speichern.

Wenn ja, könnte dies ein Weg sein:

with test(s) as (select ' a cd efg hijk lmnop qrst uvw xy z LMNOP' from dual) 
select word 
from (
     select regexp_substr(s, '[^ ]+', 1, level) as word, 
       rank() over (partition by 1 order by length(regexp_substr(s, '[^ ]+', 1, level)) desc) as rank 
     from test 
     connect by regexp_instr(s, '[^ ]+', 1, level) > 0 
    ) 
where rank = 1 

WORD 
---------- 
lmnop 
LMNOP 

Die innere Abfrage verwendet eine häufig verwendete Methode Strings aufgeteilt und verwendet dann rank jede Zeile zu bewerten auf der Basis der Länge seines Wortes:

with test(s) as (select ' a cd efg hijk lmnop qrst uvw xy z LMNOP' from dual) 
select regexp_substr(s, '[^ ]+', 1, level) as word, 
     rank() over (partition by 1 order by length(regexp_substr(s, '[^ ]+', 1, level)) desc) as rank 
from test 
connect by regexp_instr(s, '[^ ]+', 1, level) > 0 

WORD    RANK 
---------- ---------- 
lmnop    1 
LMNOP    1 
hijk    3 
qrst    3 
efg     5 
uvw     5 
xy     7 
cd     7 
z     9 
a     9 

Der externe Teil filtert einfach das Ergebnis, um nur die Zeilen mit den Wörtern an erster Stelle zu erhalten, das sind die längsten Wörter.

Dies funktioniert, wenn Sie mehr als ein Wort mit der höchsten Länge haben, und basiert auf der Annahme, dass die Eingabezeichenfolgen das von Ihnen gepostete Format haben; Wenn Sie zum Beispiel ein Komma hinzufügen, um die Wörter zu trennen, wird es als Teil des Wortes betrachtet.

Verwandte Themen