通过在Oracle中使用解码来按顺序连接

时间:2016-05-31 08:34:54

标签: sql oracle group-by sql-order-by decode

我在下面的查询中,我希望连接()的合并列结果并根据颜色排序,以便FC,FM,MS首先出现'R',然后'Y' }。我试过下面的查询,但排序不正常。

'G'

2 个答案:

答案 0 :(得分:1)

只需使用CASE EXPRESSION,我更喜欢它,因为它更容易阅读:

ORDER BY CASE WHEN FC = 'R' THEN 1
              WHEN FC = 'Y' THEN 2
              WHEN FC = 'G' THEN 3
         END,
         CASE WHEN FM = 'R' THEN 1
              WHEN FM = 'Y' THEN 2
              WHEN FM = 'G' THEN 3
         END,
         CASE WHEN MS = 'R' THEN 1
              WHEN MS = 'Y' THEN 2
              WHEN MS = 'G' THEN 3
         END

如果我明白你想做什么,我不是按照你想做的逻辑,我认为它的作用是在FC||FM||MS等于R/Y/G时检查,我认为不是

编辑:如果您想先订购,如果其中一个是' R',那么如果其中一列是' Y' ...

ORDER BY CASE WHEN 'R' IN(FC,FM,MS) THEN 1
              ELSE 2
         END,
         CASE WHEN 'Y' IN(FC,FM,MS) THEN 1
              ELSE 2
         END,
         CASE WHEN 'G' IN(FC,FM,MS) THEN 1
              ELSE 2
         END

答案 1 :(得分:1)

将字符串连接值分隔为单独的解码:

ORDER BY DECODE( FC, 'R', 1, 'Y', 2, 'G', 3 ),
         DECODE( FM, 'R', 1, 'Y', 2, 'G', 3 ),
         DECODE( MS, 'R', 1, 'Y', 2, 'G', 3 )

如果您希望忽略值NULL,只是按第​​一个非NULL排序,那么:

ORDER BY DECODE( COALESCE( FC, FM, MS ), 'R', 1, 'Y', 2, 'G', 3 ),
         DECODE( COALESCE( FM, MS),      'R', 1, 'Y', 2, 'G', 3 ),
         DECODE( MS,                     'R', 1, 'Y', 2, 'G', 3 )

或:

ORDER BY DECODE( COALESCE( FC, FM, MS ), 'R', 1, 'Y', 2, 'G', 3 ),
         DECODE( COALESCE( FM, MS, FC ), 'R', 1, 'Y', 2, 'G', 3 ),
         DECODE( COALESCE( MS, FC, FM ), 'R', 1, 'Y', 2, 'G', 3 )