Verwendung von SUBSTRING mit REGEXP in MySQL

14

Ich habe folgende Situation. Ich muss reguläre Ausdrücke aus der Beschreibung mit MySQL ableiten. Beschreibung:

Lorem D9801 ipsum dolor sitzen amet

Wobei D9801 REGEXP ist. Jede Beschreibung mit starkem Text hat einen anderen Inhalt, aber mein regulärer Ausdruck sollte so aussehen: REGEXP 'D [[: digit:]] {4}'

REGEXP hat immer "D" am Anfang und "xxxx" - 4 Ziffern am Ende: Dxxxx

Ich weiß, dass REGEXP nur den Wert true / false zurückgibt, aber wie kann ich abfragen, ob nur der Wert 'D9801' zurückgegeben wird?

Ich habe so etwas ausprobiert:

SELECT SUBSTRING (description, LOCATE(REGEXP 'D[[:digit:]]{4}', description), 5)
FROM (
   SELECT "Lorem D9801 ipsum dolor sit amet" AS description
) temp

Ich weiß, dass es falsch ist, also versuche ich Folgendes:

SELECT 
    id, 
    SUM(description REGEXP 'D[[:digit:]]{4}') AS matches, 
    CASE
        WHEN (SUM(description REGEXP 'D[[:digit:]]{4}') > 0) THEN 
            SUBSTRING(description, LOCATE( /*POSITION_OF_REGEXP_IN_DESC*/ , description), 5)
        ELSE 'Brak schematu'
    END AS show_substr FROM ps_description GROUP BY id;

Aber wie finde ich die Position von RegExp?

Ich habe von UDF gehört, kann es aber nicht verwenden. Ich verwende OVH-Hosting.

Marek Andrzejak
quelle
Dies ist im Grunde ein Dup von: stackoverflow.com/questions/4021507/…
Nathan Feger
Ohne eine UDF verwenden es keine Funktionalität gebaut wird , um das abgestimmte Muster aus der REGEXP Funktion und die anderen passenden Methoden beruhen auf zu wissen , die vollständige Zeichenfolge Sie passen für die nicht funktioniert in dieser Situation abrufen
Payload

Antworten:

3

Dazu müsste die Syntax LOCATEund verwendet werden SUBSTRING, um die Informationen aus der Zeichenfolge abzurufen. Die grundlegende Locate-Syntax, die Sie benötigen würden, wird hier erklärt .

LOCATE (Suche nach str, str, [Position])

search str = Ein String, nach dem gesucht wird.

str = Ein String, der durchsucht werden soll.

position (optional) = Position, von der aus (innerhalb des zweiten Arguments) die Suche gestartet wird.

Während die Teilzeichenfolge-Funktion, die Sie benötigen, hier erklärt wird

SUBSTRING (str, pos, len)

str = Eine Zeichenfolge.

pos = Startposition.

len = Länge in Zeichen.

Die einfachere Art, dies anzuzeigen, besteht darin, sich den Teilstring als folgenden SUBSTRING vorzustellen (str FROM pos FOR len).

Die Systemsteuer, mit der ich das zweite Wort abgerufen habe, ist unten angegeben. Ich habe die Leerzeichen ausgenutzt, die sich ständig um das zweite Wort befinden, das Sie extrahieren möchten.

declare @String varchar(50) ='Lorem D9801 ipsum dolor sit amet'

SUBSTRING
(
@String,
LOCATE(' ', @String),
LOCATE(' ', @String, (LOCATE(' ', @String) + 1)) - LOCATE(' ', @String)
)
James Rhoat
quelle
1

Leider gibt die reguläre Ausdrucksfunktion von MySQL je nach Vorhandensein oder Nichtvorhandensein des Ausdrucks true, false oder null zurück.

Der Trick, um das gewünschte Verhalten zu erzielen, besteht darin, zu bestimmen, welcher Teilstring mit dem gewünschten Zeichen beginnt, die richtige Länge hat und von einer Zahl gefolgt wird. Eine Reihe von substring_index-Funktionen wird verwendet, um die Zeichenfolge zu extrahieren ...

set @string:='Lorem D9801 ipsum dolor sit amet';
select
case when @string like '% D____ %' and cast((@num:= substring_index(substring_index(@string,concat(substring_index(@string,' D',1),' D'),-1),' ',1)) as signed) between '0' and '9999' then concat('D',@num)
     when @string like '% D% D____ %' and cast((@num:= substring_index(substring_index(@string,concat(substring_index(@string,' D',2),' D'),-1),' ',1)) as signed) between '0' and '9999' then concat('D',@num)
     when @string like '% D% D% D____ %' and cast((@num:= substring_index(substring_index(@string,concat(substring_index(@string,' D',3),' D'),-1),' ',1)) as signed) between '0' and '9999' then concat('D',@num)
     when @string like '% D% D% D% D____ %' and cast((@num:= substring_index(substring_index(@string,concat(substring_index(@string,' D',4),' D'),-1),' ',1)) as signed) between '0' and '9999' then concat('D',@num)
     when @string like '% D% D% D% D% D____ %' and cast((@num:= substring_index(substring_index(@string,concat(substring_index(@string,' D',5),' D'),-1),' ',1)) as signed) between '0' and '9999' then concat('D',@num)
end as test_case;
+-----------+
| test_case |
+-----------+
| D9801     |
+-----------+
1 row in set (0.00 sec)
RMathis
quelle