我正在尝试按同一列中的ASC和DESC顺序对数据库中的产品仓位置进行排序,以允许仓库选取器在仓库孤岛中编织以选取产品。换句话说,当一个拣选者从仓库中得到一批要拣选的订单时,系统需要在isle 1的前面启动它们,然后订单拣选沿着isle进行到底。然后它会跳到2号岛的尽头(而不是一开始),他们会朝2号岛的前面走,然后从3号岛的前面开始,以此类推。
bin位置的格式为:ISLE-BAY-SHELF-SLOT/bin
下面是要选取的bin位置的数据表示例:
1-0-A-01号
1-1-D-06号
1-2-E-10号
1-2-E-11号
1-10-A-01号
2-1-D-02号
2-1-C-12号
2-5-F-01号
3-5-A-12号
3-6-D-01号
4-5-A-02号
4-5-A-03号
4-5-B-10号
我需要执行一个SQL查询,然后拉取位置并按如下顺序进行排序:
1-0-A-01号
1-1-D-06号
1-2-E-10号
1-2-E-11号
1-10-A-01号
2-5-F-01号
2-1-D-02号
2-1-C-12号
3-5-A-12号
3-6-D-01号
4-5-B-10号
4-5-A-03号
4-5-A-02号
只使用一个SQL查询就可以做到这一点吗?
最佳答案
是的,这可以在SQL查询中完成,尽管语法并不简单。
首先需要使用表达式将ISLE-BAY-SHELF“拆分”为单独的组件,然后在ORDER BY子句中使用这些表达式。
对于MySQL
一些示例表达式,放在选择列表中,以便我们可以看到它们返回的内容:
SELECT SUBSTRING_INDEX('1-10-A-01','-',1)+0 AS ISLE
, SUBSTRING_INDEX(SUBSTRING_INDEX('1-10-A-01','-',2),'-',-1)+0 AS BAY
, SUBSTRING_INDEX(SUBSTRING_INDEX('1-10-A-01','-',3),'-',-1) AS SHELF
, SUBSTRING_INDEX('1-10-A-01','-',-1)+0 AS `SLOT/BIN`
这些表达式基于这样一个假设,即始终有三个破折号,并且始终采用数字-数字(无论数字是什么)格式。
给定样本数据,我们可以检查ISLE组件是偶数还是奇数,然后基于此对间隔进行升序或降序。但这可能不是你想要的,如果跳过一个通道,如果我们完全跳过第二个通道,只跳过第1和第3个通道。
CREATE TABLE ibss (ibss VARCHAR(20));
INSERT INTO ibss (ibss) VALUES
('1-0-A-01')
,('1-1-D-06')
,('1-2-E-10')
,('1-2-E-11')
,('1-10-A-01')
,('2-5-F-01')
,('2-1-D-02')
,('2-1-C-12')
,('3-5-A-12')
,('3-6-D-01')
,('4-5-B-10')
,('4-5-A-03')
,('4-5-A-02');
SELECT i.ibss
, SUBSTRING_INDEX(i.ibss,'-',1)+0 AS ISLE
, SUBSTRING_INDEX(SUBSTRING_INDEX(i.ibss,'-',2),'-',-1)+0 AS BAY
, SUBSTRING_INDEX(SUBSTRING_INDEX(i.ibss,'-',3),'-',-1) AS SHELF
, SUBSTRING_INDEX(i.ibss,'-',-1)+0 AS `SLOT/BIN`
, (SUBSTRING_INDEX(i.ibss,'-',1)+0) MOD 2 AS odd_or_even_isle
, IF((SUBSTRING_INDEX(i.ibss,'-',1)+0) MOD 2
,SUBSTRING_INDEX(SUBSTRING_INDEX(i.ibss,'-',2),'-',-1)+0,NULL
) AS odd_bay
, IF((SUBSTRING_INDEX(i.ibss,'-',1)+0) MOD 2
,NULL,SUBSTRING_INDEX(SUBSTRING_INDEX(i.ibss,'-',2),'-',-1)+0
) AS even_bay
FROM ibss i
ORDER BY -- ascending by ISLE
SUBSTRING_INDEX(i.ibss,'-',1)+0 ASC
-- ascending by BAY if ISLE is odd
, IF((SUBSTRING_INDEX(i.ibss,'-',1)+0) MOD 2
,SUBSTRING_INDEX(SUBSTRING_INDEX(i.ibss,'-',2),'-',-1)+0,NULL
) ASC
-- descending by BAY if ISLE is even
, IF((SUBSTRING_INDEX(i.ibss,'-',1)+0) MOD 2
,NULL,SUBSTRING_INDEX(SUBSTRING_INDEX(i.ibss,'-',2),'-',-1)+0
) DESC
-- ascending by shelf
, SUBSTRING_INDEX(SUBSTRING_INDEX(i.ibss,'-',3),'-',-1)
-- ascending by SLOT/BIN
, SUBSTRING_INDEX(i.ibss,'-',-1)+0
同样,按BAY的升序/降序将取决于ISLE是偶数还是奇数,而不是取决于这是不是一个交替的通道。(如果您希望选取器沿通道沿同一方向移动,而不是沿相反方向移动,则此行为可能是可取的。)若要根据“通道更改”更改顺序,则需要添加一些附加逻辑。
ibss ISLE BAY SHELF SLOT/BIN odd_or_even_isle odd_bay even_bay
--------- ------ ------ ------ -------- ---------------- ------- ----------
1-0-A-01 1 0 A 1 1 0 (NULL)
1-1-D-06 1 1 D 6 1 1 (NULL)
1-2-E-10 1 2 E 10 1 2 (NULL)
1-2-E-11 1 2 E 11 1 2 (NULL)
1-10-A-01 1 10 A 1 1 10 (NULL)
2-5-F-01 2 5 F 1 0 (NULL) 5
2-1-C-12 2 1 C 12 0 (NULL) 1
2-1-D-02 2 1 D 2 0 (NULL) 1
3-5-A-12 3 5 A 12 1 5 (NULL)
3-6-D-01 3 6 D 1 1 6 (NULL)
4-5-A-02 4 5 A 2 0 (NULL) 5
4-5-A-03 4 5 A 3 0 (NULL) 5
4-5-B-10 4 5 B 10 0 (NULL) 5