2012-06-07 36 views
1

我有一列包含字母和數字的混合。我需要從列中獲取第一組字母字符。只要遇到一個整數,我不希望任何更多..例如:Mysql只提取字母字符

取5行:

  • S123J90
  • SF91K88
  • JK12K99
  • X129PL9
  • ABCD123

我需要這些5行中的以下數據

  • 小號
  • SF
  • JK
  • X
  • ABCD

我發現講了很多關於嵌套查詢替換,但我敢肯定有一個更好的選擇在那裏?

注:所有行與至少一個字母字符開頭


更新:我用這個功能http://www.rummandba.com/2011/02/mysql-function-to-remove-non.html的修改如下

DROP FUNCTION IF EXISTS remove_non_alpha_char_f // 
CREATE FUNCTION remove_non_alpha_char_f (prm_strInput varchar(255)) 
RETURNS VARCHAR(255) 
DETERMINISTIC 
BEGIN 
    DECLARE i INT DEFAULT 1; 
    DECLARE v_char VARCHAR(1); 
    DECLARE v_parseStr VARCHAR(255) DEFAULT ' '; 

WHILE (i <= LENGTH(prm_strInput)) DO 

    SET v_char = SUBSTR(prm_strInput,i,1); 
    IF v_char REGEXP '^[A-Za-z ]+$' THEN #alpha 

     SET v_parseStr = CONCAT(v_parseStr,v_char); 
     SET i = i + 1; 
    ELSE 
    SET i=256; 
    END IF; 

END WHILE; 
RETURN trim(v_parseStr); 
END 

注:我已經重新編碼的功能對於這個答案,所以語法可能會失效。

+1

你需要mysql來爲你做這個嗎?在sql –

+0

以外的任何編程語言中執行相當簡單,我可以在應用程序代碼中執行此操作。儘管我有29M行..如果我可以在MySql中找到一個快速方法,我相信它會運行得更快。 – Niall

+0

ifound一個你可能會覺得有用的鏈接http://forums.mysql.com/read.php?10137433,137433顯然它不是很簡單,它肯定是我的知識之外。我最好的選擇是創建一個小腳本和另一個列(或表)。該腳本遍歷所有記錄一次,然後將提取的字符存儲在新列中。稍後,我會嘗試通過更改此記錄的存儲方式來更新此列。 –

回答

1

您可以使用SUBSTRING(),LENGTH()檢查每個字符以查看它是否按字母順序並將其添加到結果中來創建遞歸函數。

它一旦到達字符串的末尾或點擊一個數字就會退出。

+0

謝謝 - 我最終修改了這個函數的一個版本(將函數發佈在答案中):http://www.rummandba.com/2011/02/mysql-function-to-remove-non.html – Niall

0

對於每一行,請嘗試以下操作:

$split = preg_split("/\d/", $your_str); 

你想$split[0]從是$split數組。

請注意這是PHP - @Pablo是正確的,你真的需要MySQL來爲你做這個嗎?