2017-06-30 5 views
-1

Ich versuche ein Feld basierend auf einem anderen Feld zu aktualisieren.mysql berechnet Feld basierend auf Regexp

Daten sieht wie folgt aus:

id|Measurement 

1|15x52 9x2 

Letztlich ich das berechnete Feld möchten wie:

id|Measurement|calcField 

1|15x52 9x2|798 

Messung haben kann "Hallo, George", etc., so nur, wenn wir finden, a [Ziffer] x [Ziffer] sollten wir berechnen.

würde ich gerne mit:

id|Measurement|calcField 

1|15x52 9x2|780 18 

Jede mögliche Hilfe geschätzt! Danke.

+0

Warum nicht in Ihrem Anwendungscode herausfinden und es einfügen? – tadman

+0

Vielen Dank für Ihren Kommentar. Hauptsächlich suche ich nach Regex, um diesem Muster zu entsprechen. Es scheint der beste Ort zu sein, wo die Daten sind. Ich möchte vielleicht in Zukunft ein Update auf dem Tisch machen. Ich hatte Glück mit diesem "IF (Adresse REGEXP '^ [0-9]', SUBSTRING (Adresse, LOCATE ('', Adresse) +1), Adresse) AS addrSort', die eine Hausnummer von einer Adresse trennt, aber ich ' Ich habe Probleme mit ** [Ziffer] x [Ziffer] ** Muster. – Mike

Antwort

1

Sie müssen LOCATE() verwenden, um die Leerzeichen und x Zeichen zu finden, die Teilzeichenfolgen zwischen ihnen zu erhalten, und die Arithmetik mit diesen Teilzeichenfolgen ausführen. Leider ist dies sehr ausführlich, wenn es keinen Regexp-Matcher gibt, der Teile der Zeichenfolge extrahieren kann.

IF(Measurement REGEXP '^[0-9]+x[0-9]+ [0-9]+x[0-9]+$', 
    LEFT(Measurement, LOCATE('x', Measurement)-1) * 
    SUBSTR(Measurement, LOCATE('x', Measurement)+1, LOCATE(' ', Measurement)-LOCATE('x', Measurement)) 
    + 
    SUBSTR(Measurement, LOCATE(' ', Measurement)+1, LOCATE('x', Measurement, LOCATE(' ', Measurement))-LOCATE(' ', Measurement)-1) * 
    SUBSTR(Measurement, LOCATE('x', Measurement, LOCATE(' ', Measurement))+1), 0) 

, wenn Sie eine beliebige Anzahl von `### x

+0

Vielen Dank für Ihre Antwort! Diese Abfrage dauert sehr lange - hat noch nicht aufgehört. Würde dies 3x3 45x4 Hund 54x6 usw. behandeln? Es kann mehrere Vorkommen und etwas Text geben. – Mike

+0

Nein, es funktioniert nicht dafür, es verarbeitet nur ### x ### ### x ### '. Es ist wirklich schwierig, in MySQL zu parsen. Wenn Sie mit allgemeineren Strings arbeiten müssen, sollten Sie wahrscheinlich eine gespeicherte Funktion schreiben, die Schleifen verwendet. – Barmar

+0

Aber selbst das Finden des ersten numerischen Zeichens ist in einer gespeicherten Prozedur schwierig. – Barmar

0

Dies löste mein Problem zu behandeln haben. Obwohl ich nicht direkt in MySQL bin, ziehe ich aus dem MySQL-Feld. Ich hoffe es hilft jemandem.

$select_query = $stmt->fetch(PDO::FETCH_OBJ); 

$output_array = array(); 

$search = preg_match_all("/\b[0-9]+x[0-9]*\b/", $select_query->GridCardMeasurements, $output_array); 
$sfTotal = 0; 

foreach ($output_array[0] as $valuex) { 
    $sf = explode("x", $valuex); 
    $sfTotal += $sf[0]*$sf[1]; 
}