是否可以在单个 sqlplus select 语句中包含多个 CASE 语句?
Is it possible to have multiple CASE statements in a single sqlplus select statement?
我之前问过一个关于使用 CASE 语句在 HTML 中格式化 sqlplus 输出的问题。
我被要求修改报告以包括一个新栏,我很容易做到,但我想 'CASE' 此栏输出,以便它在 html[ 内进行颜色编码=13=]
select upper(lpad(country,6,' ')) cntry, max(timestamp) Timestamp,substr(LPAD(test_type,10,' '),0,10) Type,
CASE
WHEN ((sysdate-max(timestamp))*1440) >=60 THEN '<span class="threshold-critical">'|| ' <======= ERROR over 60 minutes since last run'||'</span>'
WHEN ((sysdate-max(timestamp))*1440) >=30 THEN '<span class="threshold-warning">'|| '<===== WARNING over 30 minutes since last run'||'</span>'
ELSE '<span class="threshold-ok">'|| '<===== GOOD_____' ||'</span>'
end status,
CASE
WHEN (ROUND(AVG((NVL(s2_time,0)+NVL(s3_time,0)+NVL(s4_time,0)+NVL(s5_time,0)+NVL(s6_time,0)+NVL(s7_time,0)+NVL(s8_time,0)+NVL(s9_time,0)+NVL(s10_time,0))/1000),1)) >=60 THEN '<span class="average-critical"</span>'
WHEN (ROUND(AVG((NVL(s2_time,0)+NVL(s3_time,0)+NVL(s4_time,0)+NVL(s5_time,0)+NVL(s6_time,0)+NVL(s7_time,0)+NVL(s8_time,0)+NVL(s9_time,0)+NVL(s10_time,0))/1000),1)) >=35 THEN '<span class="average-warning"</span>'
ELSE '<span class="average-ok"</span>'
END Average
from rfgdba.perf_test_results ptr, rfgdba.perf_tests pt
where country is not null and test_id in ((select id from rfgdba.perf_tests where live='Y')) and test_type in ('ORACLE','SIEBEL')
and timestamp > sysdate-(59/1440) and ptr.test_id=pt.ID
group by country, test_type
order by country, TRUNC(timestamp, 'HH24')
知道为什么这不起作用吗?
输出示例 - 奇怪的是它在 sqlplus
中有效
这应该可行,简单示例:
-- some test data
with data as
(select 1 as id, 'A' as val
from dual
union
select 2, 'B' from dual)
select case
when id = 1 then
'1'
else
'not 1'
end as col1,
case
when val = 'B' then
'B'
else
'not B'
end as col2
from data
我之前问过一个关于使用 CASE 语句在 HTML 中格式化 sqlplus 输出的问题。
我被要求修改报告以包括一个新栏,我很容易做到,但我想 'CASE' 此栏输出,以便它在 html[ 内进行颜色编码=13=]
select upper(lpad(country,6,' ')) cntry, max(timestamp) Timestamp,substr(LPAD(test_type,10,' '),0,10) Type,
CASE
WHEN ((sysdate-max(timestamp))*1440) >=60 THEN '<span class="threshold-critical">'|| ' <======= ERROR over 60 minutes since last run'||'</span>'
WHEN ((sysdate-max(timestamp))*1440) >=30 THEN '<span class="threshold-warning">'|| '<===== WARNING over 30 minutes since last run'||'</span>'
ELSE '<span class="threshold-ok">'|| '<===== GOOD_____' ||'</span>'
end status,
CASE
WHEN (ROUND(AVG((NVL(s2_time,0)+NVL(s3_time,0)+NVL(s4_time,0)+NVL(s5_time,0)+NVL(s6_time,0)+NVL(s7_time,0)+NVL(s8_time,0)+NVL(s9_time,0)+NVL(s10_time,0))/1000),1)) >=60 THEN '<span class="average-critical"</span>'
WHEN (ROUND(AVG((NVL(s2_time,0)+NVL(s3_time,0)+NVL(s4_time,0)+NVL(s5_time,0)+NVL(s6_time,0)+NVL(s7_time,0)+NVL(s8_time,0)+NVL(s9_time,0)+NVL(s10_time,0))/1000),1)) >=35 THEN '<span class="average-warning"</span>'
ELSE '<span class="average-ok"</span>'
END Average
from rfgdba.perf_test_results ptr, rfgdba.perf_tests pt
where country is not null and test_id in ((select id from rfgdba.perf_tests where live='Y')) and test_type in ('ORACLE','SIEBEL')
and timestamp > sysdate-(59/1440) and ptr.test_id=pt.ID
group by country, test_type
order by country, TRUNC(timestamp, 'HH24')
知道为什么这不起作用吗?
输出示例 - 奇怪的是它在 sqlplus
中有效这应该可行,简单示例:
-- some test data
with data as
(select 1 as id, 'A' as val
from dual
union
select 2, 'B' from dual)
select case
when id = 1 then
'1'
else
'not 1'
end as col1,
case
when val = 'B' then
'B'
else
'not B'
end as col2
from data