我正在尝试按同一列中的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

07-24 19:09