MySql将varchar排序为int,以字符开头
我的数据库中有“name”列,客户机在其中输入如下值: 样品1、样品2、样品101、样品11、样品20、样品100、部分样品、活性样品等 因此,当我想按此列对数据进行排序时,结果是:MySql将varchar排序为int,以字符开头,mysql,sorting,int,varchar,Mysql,Sorting,Int,Varchar,我的数据库中有“name”列,客户机在其中输入如下值: 样品1、样品2、样品101、样品11、样品20、样品100、部分样品、活性样品等 因此,当我想按此列对数据进行排序时,结果是: active sample sample 1 sample 100 sample 101 sample 11 sample 2 sample 20 some sample 反而 active sample sample 1 sample 2 sample 11 sample 20 sample 100 samp
active sample
sample 1
sample 100
sample 101
sample 11
sample 2
sample 20
some sample
反而
active sample
sample 1
sample 2
sample 11
sample 20
sample 100
sample 101
some sample
所以,数据从不以数字开头,有时以数字结尾,但有时根本不以数字结尾。
按字母顺序排列很重要,但当数据包含相同的前缀时,它应该按int顺序排列值
提前感谢。将这段极其难看的代码分解 获取初始值并测试它是否包含
'
字符。如果是,那么我们开始对'
字符的索引进行拆分,如果不是,那么只返回初始值。对于''
分隔字符串的每个附加可能性,开始递归。这是为了允许2个“”分隔的单词后跟一个数值,或者根据具体情况而定
SQL Fiddle在此:
查询:
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 ║ FIRSTPART ║ SECONDPART ║ THIRDPART ║
╠═══════════════╬═══════════╬════════════╬═══════════╣
║ asdf 1 ║ asdf ║ 1 ║ 0 ║
║ asdf 2 ║ asdf ║ 2 ║ 0 ║
║ sample ║ sample ║ 0 ║ 0 ║
║ sample 1 ║ sample ║ 1 ║ 0 ║
║ sample 2 ║ sample ║ 2 ║ 0 ║
║ sample 11 ║ sample ║ 11 ║ 0 ║
║ sample 20 ║ sample ║ 20 ║ 0 ║
║ sample 100 ║ sample ║ 100 ║ 0 ║
║ sample 101 ║ sample ║ 101 ║ 0 ║
║ sample test 1 ║ sample ║ test ║ 1 ║
║ sample test 2 ║ sample ║ test ║ 2 ║
╚═══════════════╩═══════════╩════════════╩═══════════╝
╔═══════════════╦═══════════╦════════════╦═══════════╗
║ 样本信息║ 第一部分║ 第二部分║ 第三部分║
╠═══════════════╬═══════════╬════════════╬═══════════╣
║ 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
工作会更好,举几个例子。这也会根据您在评论中的陈述对您的数据做出一些假设。如果数据包含一个数字,是否总是用空格分隔?此外,数据是否可以像sample 123 moretext
?是的,它总是分开的,但数字前可以有多个单词。我仍然没有找到像“sample 123 moretext”这样的数据。你希望没有数字的前缀排在第一还是最后?嗨,迈克尔,如果它们排在第一会更好。