更新字段中的值,其中值落在字符串中的特定索引处

时间:2014-12-11 14:40:58

标签: mysql sql

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

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

0 0 0 1 12 7 -1 6 9 15

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

charindex不能这样做,因为如果2位数字小于10,则有时会是单位数(如上所示)。区分新数字的唯一方法是空间定界。

任何想法,如果这是可能的,我怎么可能这样做?

感谢。

2 个答案:

答案 0 :(得分:1)

我认为你可以这样做:

select concat_ws(' ', substring_index(field, ' ', 3),
                 replace(substring_index(substring_index(field, ' ', 7), ' ', -4), -1, 0),
                 substring_index(field, ' ', -3)
                )

这将列表分为三个部分 - 前三个元素,中间四个,后三个。 replace()仅在中间四位完成。

然后你应该修复数据结构以使用联结表。

答案 1 :(得分:1)

这还没有经过全面测试。我可能会运行这个,并检查一些,以确保您得到所需的结果。将其转换为更新很简单。或者您可以将其写入临时表,然后将其加入并更新。我更喜欢后者,因为至少你知道你改变了哪些以及它们之前是什么。

逻辑非常简单。获取前3个数字。确定第4个数字是-1还是2个数字/字符。我必须这样做以使间距正确。获得第5和第6个数字。确定第7个数字是-1还是2个数字/字符。得到第8,第9,第10个数字。

<强> SQL Fiddle Demo

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';