我正在为新的货车系统创建一个拣货和包装清单,因为这条路线是最佳的,我需要按产品行所在的顺序对SKU清单进行分类。第一个字母或前两个字母表示我们仓库的位置。
所以从这样的排序中得到这个列表:
ORDER BY IF(sku RLIKE '^[a-z]', 1, 2), sku ASC;
+-------------+
| sku |
+-------------+
| A3-1-1195 |
| A3-1-1195 |
| AA6-8-7117 |
| AB10-7-6405 |
| AB10-7-6405 |
| AB4-4-3487 |
| AB5-6-3460 |
| AB6-3-3445 |
| C1-8-5623 |
| K1-4-1835 |
| O7-7-4737 |
| O8-7-4344 |
| O8-7-4344 |
| U1-8-6664 |
+-------------+
编辑:
我理想的结果是,如果所有数字排序首先优先,然后是数字。这是捕获,但如果第二个字符是数字,则应按字母顺序排序。
+-------------+
| sku |
+-------------+
| AB4-4-3487 |
| AB5-6-3460 |
| AB6-3-3445 |
| AB10-7-6405 |
| AB10-7-6405 |
| AA6-8-7117 |
| A3-1-1195 |
| A3-1-1195 |
| C1-8-5623 |
| K1-4-1835 |
| O7-7-4737 |
| O8-7-4344 |
| O8-7-4344 |
| U1-8-6664 |
+-------------+
答案 0 :(得分:0)
您可以尝试将字段拆分为5个字段: np =您的位置字段的大小 position = position char(s) n1 =第一个数字 n2 =第二个数字 n3 =第三个数字
和sonrt与这些领域。 下面是一个没有表连接的示例(用于在查询浏览器中测试您的数据):
SELECT
sku,
MID(sku, 1, np) AS position,
REPLACE(MID(sku, np+1, 2), '-', '') AS n1,
REPLACE(MID(sku, np+3, 2), '-', '') AS n2,
REPLACE(MID(sku, np+5, LENGTH(sku)), '-', '') AS n3
FROM (
SELECT
IF(MID(sku, 2, 1) REGEXP '[0-9]', 1, 2) AS np,
s.*
#subquery for this test
FROM (
SELECT 'A3-1-1195' AS sku
UNION ALL SELECT 'A3-1-1195'
UNION ALL SELECT 'AA6-8-7117'
UNION ALL SELECT 'AB10-7-6405'
UNION ALL SELECT 'AB10-7-6405'
UNION ALL SELECT 'AB4-4-3487'
UNION ALL SELECT 'AB5-6-3460'
UNION ALL SELECT 'AB6-3-3445'
UNION ALL SELECT 'C1-8-5623'
UNION ALL SELECT 'K1-4-1835'
UNION ALL SELECT 'O7-7-4737'
UNION ALL SELECT 'O8-7-4344 '
UNION ALL SELECT 'O8-7-4344'
UNION ALL SELECT 'U1-8-6664') as s
) AS s
ORDER BY np DESC, position, n1, n2, n3