Längste Wort in einer Spalte finden

bdt600

Erfahrenes Mitglied
Hallo zusammen,

ich habe da mal ein echtes Rätsel, wobei ich mir nicht sicher bin, ob das überhaupt geht. Eine Tabelle sieht ungefähr so aus:

id, text
1, "Guten Morgen liebe Forenmitglieder"
2, "Der Donaudampfschifffahrtskapitän hat Urlaub"
3, "Mal sehen, wer das Rätsel knacken kann"

Jetzt möchte ich das längste Wort, also Donaudampfschifffahrtskapitän, in der Spalte finden. Lässt sich das mit einem Select realisieren?
 
Ich habe da mal eine Lösung für MySQL. in anderen Sprachen sieht das anders aus. Grundsätzlich empfehle ich dir, das nicht so zu lösen. Eher mit Stored Procedures oder im Programm Code .

DB Fiddle - SQL Database Playground
SQL:
WITH RECURSIVE cte_connect_by AS (
    WITH  t1 AS (
        SELECT id,
        @txt:=REGEXP_REPLACE(text, '\\W+', ';') AS txt,
        LENGTH(@txt) - LENGTH(REPLACE(@txt, ';', '')) + 1 AS cnt
        FROM t
    )
    SELECT
        tx.id,
        1 AS level, 
        CAST((SELECT regexp_substr(txt, '[^;]+', 1, 1) FROM t1 WHERE t1.id = tx.id) AS CHAR(50)) AS word
    FROM t1 AS tx
    UNION ALL
    SELECT 
        tx.id,
          level + 1 AS level, 
          (SELECT regexp_substr(txt, '[^;]+', 1, level) FROM t1 WHERE t1.id = tx.id)
    FROM 
        cte_connect_by, t1 as tx
    WHERE level <= tx.cnt
),
calc AS (
      SELECT distinct 
          id, 
          level, 
          word, 
          LENGTH(word) AS lng, 
          MAX(LENGTH(word)) OVER(PARTITION BY id) as max_lng
      FROM cte_connect_by AS src
)
select id, word
from calc
where lng = max_lng
 
Vielen Dank. Wenn ich das so sehe, sollte ich es dann doch besser vergessen. In der Tabelle können durchaus mehr als eine Million Einträge stehen, da wird die Performance vermutlich in die Knie gehen. Außerdem dürfte es Probleme mit Oracle und/oder MS Sql geben.

Trotzdem vielen Dank, ich hatte auf eine leichtere Lösung gehofft.

PS: Sensationell, was du vor Lösungsansätze zusammen bauen kannst.
 
Ev. gibts auch einfachere Lösungen. Mein Ansatz war, pro Wort eine Zeile zu erstellen und dann die Längen vergleichen. Aber performant wird glaub nix davon sein.
Es zeigt eher, dass vieles Möglich ist, aber noch lange nicht sinnvoll :)
 
In MS SQL gibt's ab Level 130 (auch auf Server-Version achten) die STRING-SPLIT-Funktion
STRING_SPLIT (Transact-SQL) - SQL Server

In Oracle/MySQL könnte man glaube ich mit REGEXP_SUBSTR arbeiten. Müsste ich aber nochmal prüfen.
bzw. Yaslaw benutzt das ja in seiner MySQL-Lösung
 
Zuletzt bearbeitet:
Vielen Dank, musst du aber nicht machen. Da ich davon ausgehe, dass das die Performance in den Keller zieht, habe ich mich von dem Gedanken verabschiedet. Wäre ein schönes Gimmik gewesen, aber ich komme auch ohne zurecht.
Ah, OK.
Wobei die Überlegung wegen der Performance durchaus plausibel ist.

Andererseits ist es käse einfach, dass aus dem Frontend-Code herauszufinden, falls du tatsächlich NUR das längste Wort finden willst (also z.B. ohne die ID, in welchem Satz dieses Wort enthalten ist).

Du holst dir den "Text" nämlich per Group_concat (MySQL, in MSSQL ist das STRING_AGG) an einem Stück raus (ggfs. "mehrere" Trennzeichen vorher normalisieren (=ersetzen mit Bsp. Komma durch Leerzeichen --> in deinem Beispiel hast du Leerzeichen als auch Komma als Trennzeichen).
Du erhälst einen einzigen Result-Datensatz als ellenlangen String, wirfst diesen im Frontend in eine Split-Funktion, erhälst ein Array mit allen einzelnen Wörtern, und dann rennst du einmal durch das Array, und prüfst die Länge jedes Members.
 
Vielleicht noch einmal zur Erklärung:

ich habe eine Tabelle, in der eine Spalte so ausehen kann

"Guten Morgen liebe Forenmitglieder"
"Der Donaudampfschifffahrtskapitän hat Urlaub"
"Mal sehen, wer das Rätsel knacken kann"

Aus dieser einen Spalte brauche ich das längste Wort, also Donaudampfschifffahrtskapitän

Das ganze dient zur Berechnung einer Breite im Frontend. Ein Eingabefeld soll dieses Wort dann als Platzhalter bekommen und so breit sein, wie das Wort an Platz braucht.

Wie gesagt, ein schönes Gimmik, muss aber nicht sein. Wenn ich da größere Klimmzüge machen muss, um das kompatibel mit MySQL, MS SQL und Oracle zu bekommen, und dann die Perfomance in den Keller geht, dann kann ich gut darauf verzichten.

Aber trotzdem danke, dass du dir Gedanken darüber gemacht hast.
 
Zurück