在字符串字段MySQL中计算

时间:2017-03-05 13:51:06

标签: mysql

我一直在尝试在表格中编辑/添加值字符串列(进程)。

字符串中的当前值如下:

1:38,25:39,41:101

我想要做的是在“X:”之后为每个值添加1000,所以在查询之后应该读取值:

1:1038,25:1039,41:1101

我看过CONCAT,但似乎只在某些参数中的字符串中插入一个值。有什么想法吗?

3 个答案:

答案 0 :(得分:0)

您可以使用CAST CONCATSUBSTRING_INDEX函数来获取所需的输出,例如:

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

这是 SQL Fiddle

答案 1 :(得分: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. for substring_index:     https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_substring-index

答案 2 :(得分: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;

只需确保将上述查询中的SELECT org FROM mytable LIMIT 1替换为您需要编辑的字符串1:38,25:39,41:101的查询。请注意,此示例仅显示如何在一个字符串中处理该值。如果您需要处理多行的值,则需要进一步调整......

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