在 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 )
我有以下查询,我想在其中连接 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 )