Greg Reda 的解决方案不适用于长度超过 1 个字符的字符串,因为 REPLACE() 是如何编写的(仅替换要替换的字符串的第一个字符)。这是一个我认为更完整的解决方案,它涵盖了问题的每个用例,定义为如何在“String C”中将“String A”的第一次出现替换为“String B”?
CONCAT(LEFT(buycraft, INSTR(buycraft, 'blah') - 1), '', SUBSTRING(buycraft FROM INSTR(buycraft, 'blah') + CHAR_LENGTH('blah')))
这假设您确定条目已经包含要替换的字符串!如果您尝试在字符串 'pupper' 中将 'dog' 替换为 'cat',它会给你 'per',这不是你想要的。这是一个通过首先检查要替换的字符串是否存在于完整字符串中来处理该问题的查询:
IF(INSTR(buycraft, 'blah') <> 0, CONCAT(LEFT(buycraft, INSTR(buycraft, 'blah') - 1), '', SUBSTRING(buycraft FROM INSTR(buycraft, 'blah') + CHAR_LENGTH('blah'))), buycraft)
这里的具体用例是将“buycraft”列中的第一个“blah”实例替换为空字符串“”。我认为一个非常直观和自然的解决方案:
- 查找要替换的字符串第一次出现的索引。
- 获取左侧的所有内容,不包括索引本身(因此为“-1”)。
- 将其与要替换原始字符串的任何内容连接起来。
- 计算要替换的字符串部分的结束索引。这很容易通过再次找到第一次出现的索引并添加替换字符串的长度来完成。这将为您提供原始字符串之后的第一个字符的索引
- 从字符串的结束索引开始连接子字符串
将“lil_puppers_yay”中的“pupper”替换为“dog”的示例演练:
- “pupper”的索引为 5。
- 从 5-1 向左 = 4。因此索引 1-4,即“lil_”
- 为“lil_dog”连接“dog”
- 计算结束索引。起始索引为 5,并且 5 + 'pupper' 的长度 = 11。请注意,索引 11 指的是 's'。
- 连接从结束索引开始的子字符串,即“s_yay”,得到“lil_dogs_yay”。
全部完成!
注意: SQL 有 1 索引字符串(作为一个 SQL 初学者,在我发现这个问题之前我并不知道这一点)。此外,SQL LEFT 和 SUBSTRING 似乎以理想的方式使用无效索引(将其调整为字符串的开头或结尾),这对于像我这样的初学者 SQLer 来说非常方便:P
另一个注意事项:我是 SQL 的初学者,这几乎是我写过的最难的查询,因此可能存在一些效率低下的问题。但它可以准确地完成工作。