2010-04-30 197 views
8

我想從表格的字符串列中提取單詞。mysql中的REGEXP_SUBSTR等價於什麼?

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

預期的結果集

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

表將至多有100行,文本長度爲〜256炭和柱總是具有一個order_id本。所以表現不是問題。

在Oracle中,我可以使用REGEXP_SUBSTR來解決這個問題。我將如何在MySQL中解決這個問題?

編輯1

我使用的定位和SUBSTR來解決這個問題。代碼很醜陋。編寫代碼十分鐘後,我詛咒編寫這樣一個醜陋代碼的人。

我沒有在MySQL文檔中找到REGEXP_SUBSTR函數。但我希望它存在..

回答:爲什麼不能優化表?爲什麼數據以這種愚蠢的方式存儲?

我給出的例子只是表示我正試圖解決的問題。在真實場景中,我使用基於數據庫的第三方排隊軟件來執行異步任務。隊列將Ruby對象作爲文本序列化。我無法控制表格結構或數據格式。隊列中的任務可以重複發生。在我們的測試設置中,一些重複性任務由於陳舊的數據而失敗。我必須刪除這些任務以防止出現錯誤。這樣的錯誤並不常見,因此我不想維護標準化的影子表。

回答

3

就像Konerak說的那樣,在MySql中沒有等價的REGEXP_SUBSTR。你可以做你需要使用SUBSTRING邏輯的,但它是醜陋:

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 

編輯:你可以試試這個user defined function提供訪問perl的正則表達式在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

這就是我正在做的。 +1爲花時間寫這個.. – 2010-04-30 07:06:33

+1

編輯答案使用CHAR_LENGTH()而不是LENGTH(),後者是以字節返回佔用的大小,而不是字符串的長度。例如,你會遇​​到UTF8的麻煩 – 2013-06-14 05:50:11

1

沒有MySQL的等價物。 MySQL REGEXP可用於匹配字符串,但不能用於轉換它們。

您可以嘗試使用存儲過程和大量的REPLACE/SUBSTRING邏輯,或者使用您的編程語言 - 這應該是最簡單的選擇。

但是你確定你的數據格式是精心挑選的嗎?如果您需要order_id,將它存儲在不同的列中是否有意義,因此您可以放置​​索引,使用連接等?

+1

我們不能總是選擇我們數據格式。例如,在進行數據遷移或從其他系統導入數據時,我們經常需要處理任何我們提供的內容。 – APC 2010-04-30 06:42:33

+0

閱讀我更新的問題,爲什麼我有這樣的數據。 – 2010-04-30 07:07:02

0

,或者你可以做到這一點,並節省自己的醜:

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