2013-01-18 23 views
1

字符串返回一個浮點數。如果我有類似的表稱爲可變的,例如,這種類型的數據:從使用MySQL

 
id size 
1 100ml 
2 30ml 
3 6,7g 
4 8,8kg 
5 alfa 110v 
6 beta 220v 

我怎麼能提取字符串的數量,將其轉換爲一個浮點數。 (在這種情況下,,所以分離小數部分從整數之一。

,我怎麼能執行一個查詢返回這樣的事情?:

 
id size  finalSize 
3 6,7g  6,7 
4 8,8kg  8,8 
2 30ml  30 
1 100ml  100 
5 alfa 110v 110 
6 beta 220v 220 

這?(只是id`s ):

 
id 
3 
4 
2 
1 
5 
6 

PS:我需要MySQL的函數來做到這一點...

PS:2 我試圖尋找關於匹配使用MySQL正則表達式,但羅像沒有功能返回匹配的模式。 也許如果我創建一個函數來替換不是數字的everthing或,可以解決問題給我,但我找不到辦法做到這一點。 MYSQL REPLACE函數不使用正則表達式。

+2

[你嘗試過什麼?](http://www.whathaveyoutried.com/) –

+0

你似乎不需要一個浮點數,小數點會做:) – bonCodigo

+0

這確實不是那麼簡單,因爲沒有函數來檢索最後匹配的正則表達式實例。谷歌*從字符串*數字,人們寫了一個MySQL函數從字符串中提取數字。有[this](http://stackoverflow.com/questions/5361457/mysql-return-matching-pattern-in-regexp-query),非常複雜...你必須根據你的情況調整代碼,因爲','是你的小數點分隔符。 –

回答

4

下面是基於功能的解決方案:The function was readily available in one of thes posts.所以,我只能改變增加了comma到列表中,因爲它工作得很好:)

查詢:

select id, size, 
    replace(STRIP_NON_DIGIT(size),',','.') 
    as final 
from demo 
; 

功能:

CREATE FUNCTION STRIP_NON_DIGIT(input VARCHAR(255)) 
    RETURNS VARCHAR(255) 
BEGIN 
    DECLARE output VARCHAR(255) DEFAULT ''; 
    DECLARE iterator INT   DEFAULT 1; 
    WHILE iterator < (LENGTH(input) + 1) DO 
     IF SUBSTRING(input, iterator, 1) IN (',', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9') THEN 
     SET output = CONCAT(output, SUBSTRING(input, iterator, 1)); 
     END IF; 
     SET iterator = iterator + 1; 
    END WHILE; 
    RETURN output; 
END// 

結果:

| ID |  SIZE | FINAL | 
-------------------------- 
| 3 |  6,7g | 6.7 | 
| 4 |  8,8kg | 8.8 | 
| 2 |  30ml | 30 | 
| 1 |  100ml | 100 | 
| 5 | alfa 110v | 110 | 
| 6 | beta 220v | 220 | 

至於你提到自己時,MySQL確實有不一樣regex_replaceOracle。除非你想使用多個replaces(不想假設多少),否則一個函數會派上用場。

+0

@GarouDan請給這個嘗試和評論。想聽聽你是否需要任何不同的東西。 =) – bonCodigo

+1

Thx很多。此解決方案正常工作!謝謝! =) – GarouDan

+1

很酷...........! thinks –

1

試試這個

 SELECT size, 
    @num := CONVERT(size, SIGNED) AS num_part, 
    SUBSTRING(size, LENGTH(@num) + 1) AS rest_of_string 
    FROM your_table; 
0

大功能bonCodigo !!!,但我想報告此修改,以簡化工作:

DELIMITER $$ 
DROP FUNCTION IF EXISTS `EXTRACT_NUMBER`$$ 

DELIMITER $$ 
CREATE FUNCTION EXTRACT_NUMBER(input VARCHAR(255)) 
    RETURNS VARCHAR(255) 
BEGIN 
    DECLARE output VARCHAR(255) DEFAULT ''; 
    DECLARE iterator INT   DEFAULT 1; 
    WHILE iterator < (LENGTH(input) + 1) DO 
     IF SUBSTRING(input, iterator, 1) IN (',', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9') THEN 
     SET output = CONCAT(output, SUBSTRING(input, iterator, 1)); 
     END IF; 
     SET iterator = iterator + 1; 
    END WHILE; 
    RETURN CONVERT(replace(output,',','.'), DECIMAL) ; 
END $$ 
+0

您的代碼版本不會簡化任何操作。使用你的功能,你不能改變格式。基本上,你已經做出了接受答案的更糟糕的版本。 – Mjh

0

另外,我再次修改,如果字符串包含超過提取只有一個號碼一。如果存在着一些字符Ø串預differenciate,您可以致電與EXTRACT_NUMBER功能(SUBSTRING_INDEX(NOTAS,「煤焦」, - 1))是煤焦預字(S)

DELIMITER $$ 
DROP FUNCTION IF EXISTS `EXTRACT_NUMBER`$$ 

DELIMITER $$ 
CREATE FUNCTION EXTRACT_NUMBER(input VARCHAR(255)) 
    RETURNS VARCHAR(255) 
BEGIN 
    DECLARE output VARCHAR(255) DEFAULT ''; 
    DECLARE iterator INT   DEFAULT 1; 
    WHILE iterator < (LENGTH(input) + 1) DO 
     IF SUBSTRING(input, iterator, 1) IN (',', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9') THEN 
     IF (SUBSTRING(input, iterator, 1) = ',' AND output = '') 
       THEN SET output = ''; 
      END IF; 
     SET output = CONCAT(output, SUBSTRING(input, iterator, 1)); 
     END IF; 
     IF (SUBSTRING(input, iterator, 1) NOT IN (',', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9') AND output <> '') 
      THEN SET iterator = LENGTH(input); 
     END IF; 
     SET iterator = iterator + 1; 
    END WHILE; 
    RETURN replace(output,',','.'); 
END $$