Mysql 更新字段中的值,其中值位于字符串中的某个索引处

Mysql 更新字段中的值,其中值位于字符串中的某个索引处,mysql,sql,Mysql,Sql,我想以前没有人问过这个问题,但如果我错了,请纠正我 我有一个字段名,比如说'field'。它包含一个以空格分隔的10个2位数的列表: 0101127-16915 我想更新该字段,将任何-1值替换为0,如果它是第4、第5、第6或第7个数字 这不能通过charindex实现,因为如果2位数字小于10(如上所示),则它们有时是一位数字。区分新数字的唯一方法是空间定界 有什么想法,如果这是可能的,我可以怎么做 谢谢。我想你可以这样做: select concat_ws(' ', substring_in

我想以前没有人问过这个问题,但如果我错了,请纠正我

我有一个字段名,比如说
'field'
。它包含一个以空格分隔的10个2位数的列表:

0101127-16915

我想更新该字段,将任何-1值替换为0,如果它是第4、第5、第6或第7个数字

这不能通过
charindex
实现,因为如果2位数字小于10(如上所示),则它们有时是一位数字。区分新数字的唯一方法是空间定界

有什么想法,如果这是可能的,我可以怎么做


谢谢。

我想你可以这样做:

select concat_ws(' ', substring_index(field, ' ', 3),
                 replace(substring_index(substring_index(field, ' ', 7), ' ', -4), -1, 0),
                 substring_index(field, ' ', -3)
                )
这将列表分为三部分——前三个元素、中间四个元素和最后三个元素。
replace()


然后您应该修复数据结构以使用连接表。

这还没有完全测试过。我可能会运行此程序并抽查一些,以确保您获得所需的结果。将其转换为更新非常简单。或者,您可以将其写入临时表,然后将其重新连接并更新。我更喜欢后者,因为至少你知道你改变了哪些,之前是什么

逻辑很简单。获取前3个数字。确定第四个数字是-1还是2位/字符。我必须这样做,以获得正确的间距。打第五和第六号。确定第7个数字是-1还是2位/字符。获取第8、第9、第10个数字

SELECT 
  field,
  CONCAT(SUBSTRING_INDEX(field, ' ', 3),
  CASE 
    WHEN RIGHT(SUBSTRING_INDEX(field,' ',4), 2) = '-1' THEN ' 0'
    WHEN RIGHT(SUBSTRING_INDEX(field,' ',4), 2) LIKE ' %' THEN RIGHT(SUBSTRING_INDEX(field,' ',4), 2)
    ELSE RIGHT(SUBSTRING_INDEX(field,' ',4), 3)
  END,
  CONCAT(' ',SUBSTRING_INDEX(SUBSTRING_INDEX(field, ' ',6), ' ', -2)),
  CASE 
    WHEN RIGHT(SUBSTRING_INDEX(field,' ',7), 2) = '-1' THEN ' 0'
    WHEN RIGHT(SUBSTRING_INDEX(field,' ',7), 2) LIKE ' %' THEN RIGHT(SUBSTRING_INDEX(field,' ',4), 1)     
    ELSE RIGHT(SUBSTRING_INDEX(field,' ',7), 3)
  END,
  CONCAT(' ', SUBSTRING_INDEX(field, ' ', -3))) as 'newField'
FROM YourTable
WHERE RIGHT(SUBSTRING_INDEX(field,' ',4), 2) = '-1'
  OR RIGHT(SUBSTRING_INDEX(field,' ',7), 2) = '-1';

这不是您应该如何使用DB。单独存储每一个值,但是要使用遗留系统。不幸的是,我必须处理iv得到的东西。然后我会坚持改变它。不幸的是,在这种情况下,我觉得SQL并不是为这种事情而构建的。我不知道如何在SQL中实现这一点,但我感觉这是可能的。我唯一的建议是从服务器上获取数据并进行处理并进行更新。这几乎是我所需要的,但是我想可能我的问题还不够清楚,-1到0的替换需要在第4和第7个数字上进行,而不仅仅是第4和第7个数字。iv更新了您的查询以选择所需的所有值,如何使其成为更新而不是选择?
updateyourtable set field=CONCAT(substring………)
如我所说。我会先用这些值创建一个临时表,或者至少做一个备份,以便在出现一些意外影响时可以快速恢复。出于某种原因,我认为MySQL没有替换,因此我的case语句也没有替换。这似乎比上面的方法简单得多,但是结果删除了第3个和第4个数字以及第7个和第8个数字之间的空格。有没有简单的方法来解决这个问题?@MikeOram。对最简单的方法是使用
concat_ws()
(我刚刚修复了答案)。