在 Oracle 中使用 decode 按顺序连接

Concatenate in order by using decode in Oracle

我有以下查询,我想在其中连接 FC,FM,MS 的组合列结果并根据颜色排序,这样 'R' 应该先出现,然后是 'Y',然后是 'G'。我尝试了以下查询,但排序不正确。

select bps.NAME as BNM, 
max(case when bbp.BID = 0.11 then os.SO end) FC,
max(case when bbp.BID = 0.12 then os.SO end) FM, 
max(case when bbp.BID = 0.13 then os.SO end) MS 
from PR_BP bbp
JOIN PR_BP_BPP bp ON bp.BP_ID = bbp.BP_ID
JOIN BRD b ON bbp.BID = b.BID
JOIN OS_VIEW os ON bbp.BP_ID = os.OD
where os.TO = 'PR_BP_BPP' AND bbp.B_A = 'Y'
group by bp.NAME
ORDER BY FC,FM,MS

只需使用 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

将您的字符串连接值分离成单独的解码:

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 )