2017-06-30 62 views
-1

我試圖根據另一個字段更新字段。基於正則表達式計算的mysql字段

的數據是這樣的:

id|Measurement 

1|15x52 9x2 

最後,我想喜歡計算字段:

id|Measurement|calcField 

1|15x52 9x2|798 

測量可能有「你好,喬治」,等等。所以,只有當我們發現我們應該計算一個[數字] x [數字]。

我將很高興與:

id|Measurement|calcField 

1|15x52 9x2|780 18 

任何援助將不勝感激! 謝謝。

+0

爲什麼不在您的應用程序代碼中找出它並插入它? – tadman

+0

感謝您的評論。主要是我正在尋找正則表達式來匹配這種模式。看來最好的地方是數據。我可能想在將來做一個更新。我有幸運用了這個IF(地址REGEXP'^ [0-9]',SUBSTRING(地址,LOCATE(',地址)+1),地址)AS addrSort',它將街道號碼與地址分開, m有** [數字] x [數字] **模式有問題。 – Mike

回答

1

您必須使用LOCATE()來查找空格和x字符,獲取它們之間的子字符串,並使用這些子字符串進行算術運算。不幸的是,當沒有可以提取字符串部分的正則表達式匹配器時,這非常冗長。

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) 

,如果你要處理`### X

+0

謝謝你的迴應!該查詢需要很長時間才能運行 - 尚未停止。這會處理3x3 45x4狗54x6等?可能有多個事件和一些文本。 – Mike

+0

不,它不會工作,它只處理'### x ### ### x ###'。在MySQL中解析真的很難。如果你必須處理更多的通用字符串,你可能應該編寫一個使用循環的存儲函數。 – Barmar

+0

但是即使在存儲過程中查找第一個數字字符也很困難。 – Barmar

0

這解決了我的問題的任意數量。雖然不是直接在MySQL中,但我正在從MySQL領域拉動。我希望它能幫助別人。

$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]; 
}