破解这段极其丑陋的代码...
取初始值并测试它是否包含' ' 字符。如果是,那么我们开始拆分该' ' 字符的索引,如果不是,则只返回初始值。为' ' 分隔字符串的每个其他可能性开始递归。这是为了允许 2 个以 ' ' 分隔的单词后跟一个数值,或者视情况而定。
这里的 SQL 小提琴:http://sqlfiddle.com/#!2/70168/7
查询:
SELECT
sampleInfo,
IF (LOCATE(' ', sampleInfo) > 0,
SUBSTRING(sampleInfo, 1, LOCATE(' ', sampleInfo) - 1),
sampleInfo) AS firstPart,
IF (LOCATE(' ', sampleInfo) > 0,
IF (LOCATE(' ', SUBSTRING(sampleInfo, LOCATE(' ', sampleInfo) + 1)) > 0,
SUBSTRING(
SUBSTRING(sampleInfo, LOCATE(' ', sampleInfo) + 1),
1,
LOCATE(' ', SUBSTRING(sampleInfo, LOCATE(' ', sampleInfo) + 1)) - 1),
SUBSTRING(sampleInfo, LOCATE(' ', sampleInfo) + 1)),
0) AS secondPart,
IF (LOCATE(' ', sampleInfo) > 0,
IF (LOCATE(' ', SUBSTRING(sampleInfo, LOCATE(' ', sampleInfo) + 1)) > 0,
SUBSTRING(
SUBSTRING(sampleInfo, LOCATE(' ', sampleInfo) + 1),
LOCATE(' ', SUBSTRING(sampleInfo, LOCATE(' ', sampleInfo) + 1)) + 1),
0),
0) AS thirdPart
FROM test
ORDER BY
firstPart,
thirdPart,
CONVERT(secondPart, SIGNED) --if conversion fails the value is 0
结果:
╔═══════════════╦═══════════╦════════════╦════════ ═══╗
║ SAMPLEINFO ║ 第一部分 ║ 第二部分 ║ 第三部分 ║
╠═══════════════╬═══════════╬════════════╬════════ ═══╣
║ asdf 1 ║ asdf ║ 1 ║ 0 ║
║ asdf 2 ║ asdf ║ 2 ║ 0 ║
║ 样品 ║ 样品 ║ 0 ║ 0 ║
║ 样品 1 ║ 样品 ║ 1 ║ 0 ║
║ 样品 2 ║ 样品 ║ 2 ║ 0 ║
║ 样品 11 ║ 样品 ║ 11 ║ 0 ║
║ 样品 20 ║ 样品 ║ 20 ║ 0 ║
║ 样品 100 ║ 样品 ║ 100 ║ 0 ║
║ 样品 101 ║ 样品 ║ 101 ║ 0 ║
║ 样品测试 1 ║ 样品 ║ 测试 ║ 1 ║
║ 样品测试 2 ║ 样品 ║ 测试 ║ 2 ║
╚═══════════════╩═══════════╩════════════╩════════ ═══╝
免责声明:此解决方案的性能或可扩展性都不是很好。通过另一种语言(例如PHP 或C#)执行此SUBSTRING 工作会为您提供更好的服务。这也会根据您在 cmets 中的陈述对您的数据做出一些假设。