我之前没有想过这个问题,但如果我错了,请纠正我。
我有一个字段名称,比方说'field'
。它包含一个空格分隔的10位数字列表:
0 0 0 1 12 7 -1 6 9 15
如果是第4,第5,第6或第7个数字,我想更新字段以将0替换为任何-1值。
charindex
不能这样做,因为如果2位数字小于10,则有时会是单位数(如上所示)。区分新数字的唯一方法是空间定界。
任何想法,如果这是可能的,我怎么可能这样做?
感谢。
答案 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';