2010-04-30 8 views
8

Voglio estrarre una parola da una colonna di stringhe di una tabella.Qual è l'equivalente di REGEXP_SUBSTR in mysql?

description 
=========================== 
abc order_id: 2 xxxx yyy aa 
mmm order_id: 3 nn kk yw 

risultato atteso impostato

order_id 
=========================== 
2 
3 

Tabella sarà al massimo hanno 100 righe, lunghezza del testo è ~ 256 char e colonna ha sempre un order_id presente. Quindi le prestazioni non sono un problema.

In Oracle, è possibile utilizzare REGEXP_SUBSTR per questo problema. Come risolverei questo in MySQL?

Modifica 1

Sto usando individuare e SUBSTR per risolvere il problema. Il codice è brutto. Dieci minuti dopo aver scritto il codice, sto maledicendo il ragazzo che ha scritto un codice così brutto.

Non ho trovato la funzione REGEXP_SUBSTR nei documenti MySQL. Ma spero che esista ..

Risposta a: Perché non è possibile ottimizzare il tavolo? Perché i dati sono archiviati in modo così stupido?

L'esempio che ho dato indica il problema che sto cercando di risolvere. Nello scenario reale, sto utilizzando un software di accodamento di terze parti basato su DB per l'esecuzione di attività asincrone. La coda serializza l'oggetto Ruby come testo. Non ho controllo sulla struttura della tabella O sul formato dei dati. Le attività in coda possono essere ricorrenti. Nella nostra configurazione di test, alcune delle attività ricorrenti stanno fallendo a causa di dati obsoleti. Devo cancellare queste attività per prevenire l'errore. Tali errori non sono comuni, quindi non voglio mantenere una tabella shadow normalizzata.

risposta

3

Come ha detto Konerak, non esiste un equivalente di REGEXP_SUBSTR in MySql. Si potrebbe fare ciò che è necessario usare la logica SOTTOSTRINGA, ma è brutto:

SELECT 
    SUBSTRING(lastPart.end, 1, LOCATE(' ', lastPart.end) - 1) AS orderId 
FROM 
    (
    SELECT 
     SUBSTRING(dataset.description, LOCATE('order_id: ', dataset.description) + LENGTH('order_id: ')) AS end 
    FROM 
     (
     SELECT 'abc order_id: 2 xxxx yyy aa' AS description 
     UNION SELECT 'mmm order_id: 3 nn kk yw' AS description 
     UNION SELECT 'mmm order_id: 1523 nn kk yw' AS description 
    ) AS dataset 
    ) AS lastPart 

Edit: Si potrebbe provare questo user defined function fornitura di accesso a perl regex in MySql

SELECT 
    PREG_CAPTURE('/.*order_id:\s(\d+).*/', dataset.description,1) 
FROM 
    (
    SELECT 'abc order_id: 2 xxxx yyy aa' AS description 
    UNION SELECT 'mmm order_id: 3 nn kk yw' AS description 
    UNION SELECT 'mmm order_id: 1523 nn kk yw' AS description 
) AS dataset 
+1

Questo è quello che sto facendo. +1 per prendere tempo per scrivere questo .. –

+1

Risposta modificata per utilizzare CHAR_LENGTH() anziché LENGTH(), quest'ultima restituisce la dimensione occupata in byte e non la lunghezza della stringa. Ad esempio, avrai problemi con UTF8 –

1

Non esiste un equivalente MySQL. MySQL REGEXP può essere utilizzato per trovare le stringhe corrispondenti, ma non per trasformarle.

È possibile provare a utilizzare le stored procedure e molta logica REPLACE/SUBSTRING o farlo nel proprio linguaggio di programmazione, che dovrebbe essere l'opzione più semplice.

Ma sei sicuro che il formato dei dati sia scelto correttamente? Se hai bisogno di order_id, non avrebbe senso memorizzarlo in una colonna diversa, quindi puoi inserire indici, usare join e simili?

+1

Non possiamo sempre scegliere il nostro formato dei dati. Ad esempio, quando eseguiamo la migrazione dei dati o importiamo materiale da un altro sistema, spesso dobbiamo gestire tutto ciò che ci viene dato. – APC

+0

Leggi la mia domanda aggiornata per il motivo per cui ho questi dati. –

0

o può fare questo e salvarti la bruttezza:

select SUBSTRING_INDEX(SUBSTRING_INDEX('habc order_id: 2 xxxx yyy aa',' ',3),' ',-1); 
Problemi correlati