2017-03-05 158 views
-1

我一直在嘗試在表中編輯/添加值字符串列(進程)。字符串字段中的計算MySQL

字符串中的電流值是如下:

1:38,25:39,41:101 

我想要做的就是加1000後的每一個值「X:」這樣的查詢後,值應爲:

1:1038,25:1039,41:1101 

我曾看過CONCAT,但似乎只在特定參數內插入一個值到字符串中。有任何想法嗎?

+2

現在你知道爲什麼正常化幫助! – GurV

+0

@Paul問題提供的示例顯示用逗號分隔的單行或多行? –

回答

0

您可以使用CASTCONCATSUBSTRING_INDEX函數來獲得所需要的輸出,例如:

SELECT 
CONCAT(SUBSTRING_INDEX(value, ':', 1), ":", (CAST(SUBSTRING_INDEX(value, ':', -1) AS UNSIGNED) + 1000)) 
FROM test; 

這裏的SQL Fiddle

+0

有問題的數據是**不是**在單獨的行中。因此,這不能回答給定的問題。 – GurV

0

使用變量可以幫助你實現你想要什麼:

select @pre := SUBSTRING_INDEX(SUBSTRING_INDEX(`column_name`, ':', 1), '0', -1), 
    @post := SUBSTRING_INDEX(SUBSTRING_INDEX(`column_name`, ':', 2), '0', -1), 
    concat(@pre,":",@post+1000) as required_value from table_name; 

參考文獻:

  1. 使用的變量: https://dev.mysql.com/doc/refman/5.7/en/user-variables.html
  2. 爲SUBSTRING_INDEX: https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_substring-index
+0

不知道這是否回答這個問題,但**從不**在同一個語句中讀寫相同的用戶變量。處理的順序不能保證,因此,結果。 – GurV

0

呦你應該規範化數據並將其存儲在一個單獨的表中。這就是說,要回答你的問題,你可以使用這些查詢來實現你想要的:

CREATE TEMPORARY TABLE temp (val VARCHAR(50)); 
SET @str = CONCAT("INSERT INTO temp (val) VALUES ('",REPLACE((SELECT org FROM mytable LIMIT 1), ",", "'),('"),"');"); 
PREPARE st FROM @str; 
EXECUTE st; 

SELECT 
GROUP_CONCAT(DISTINCT CONCAT(SUBSTRING_INDEX(val, ':', 1), ":", (CAST(SUBSTRING_INDEX(val, ':', -1) AS UNSIGNED) + 1000))) 
FROM temp; 

只需確保在您的查詢,返回1:38,25:39,41:101你需要編輯字符串上面的查詢,以取代SELECT org FROM mytable LIMIT 1。請注意,此示例僅顯示如何處理一個字符串中的值。如果你需要處理多行的值,你需要調整多一點...

檢查sqlfiddle:http://sqlfiddle.com/#!9/bf6da4/1/0