我遇到了一些我不确定如何处理的事情。我正在构建一个数据库来存储关于运动卡的信息,当我想查看某些卡片时,我在排序时遇到了一些问题。
作为背景,每张卡片(数据库中的行)都有关于年份的信息,设置卡片来自,卡片上的玩家和卡片号码(还有更多的信息,但这就是所有相关的信息)。当我看到结果时,我希望按年份排序,然后是设置,然后是玩家,然后是卡号。除了卡号之外的所有东西都工作正常,因为年份只是一个整数,并且 set 和 player 都是 varchars,所以很容易对它们进行排序。但是,卡号是我遇到的一些问题。
卡号列是一个 varchar,因为卡号可以包括字母、数字和破折号。最常见的卡号是直数(即 1、2、3、4、5)、直字母(Ex-A、Ex-B、Ex-C)、数字后跟字母(1a、1b , 2, 3a, 3b, 3c),或后跟数字的字母(A1、A2、A3、A4、A5)。这是我目前设置 SQL 字符串的排序部分的方式:
order by year desc, cardset asc, subset asc, cast(cardNum as unsigned) asc;
Run Code Online (Sandbox Code Playgroud)
这可以很好地处理大多数事情。但是我遇到的问题是,当一组卡的卡号中有相同的字母,然后有一个数字时。我希望排序基本上忽略前导字母,然后按数字排序。但是,有时它不会正确执行此操作,特别是当有超过 5 张卡片需要排序时。
具体来说,它错误地将具有以下卡号的某些卡按以下顺序排序:
什么时候应该导致:
它目前正在对直数或后跟字母的数字进行正确排序(即 1、2、3、4、5 或 1、2、3a、3b、4、5a、5b)。我不知道它不正确地对直字母进行排序有任何问题,但我目前也有很少的测试用例,所以我不确定它是否是 100%。
除了不知道如何在不弄乱其他排序的情况下修改我的 SQL 排序语句之外,我真的不知道它是如何得出上面 BCP 示例的顺序的。关于如何纠正它的任何想法?我想尝试忽略卡号中的字母,直到我们得到数字,但这会导致卡号中只有字母的卡出现重大问题。所以我有点卡住了。
绝对最坏最坏,我可能会将卡号列分成 2 个不同的列,一个用于更具描述性的部分,另一个用于我想要排序的部分。这可能最终会正常工作,但需要大量工作才能恢复正常!
编辑 - 这里有一些更多信息,包括我的数据库中的数据(抱歉格式化,不知道如何在此处制作表格):
| year | cardSet | subset | cardNum |
| 2016 | Bowman | | 52 |
| 2016 | Bowman | …Run Code Online (Sandbox Code Playgroud)