案例当...然后
CASE WHEN ... THEN
我正在尝试编辑某人几个月前写的代码,但我无法理解某些部分,例如:
CASE
WHEN #PROMPT('SEL_TYPE')# = '%' then 1
WHEN #PROMPT('SEL_TYPE')# = 'ALL' then 1
WHEN e.evt_job = #PROMPT('SEL_TYPE')# then 1
ELSE 0
END = 1
无论我在哪里读到 CASE .. WHEN
是如何工作的,都是这样的:
CASE A
WHEN 'ok' THEN C = 'ok'
WHEN 'bad' THEN C = 'bad'
但在我的示例中,它只是 THEN 1
或 ELSE 0
。
那个1或0是什么意思?这是我在代码中遗漏的东西,还是 1 或 0 意味着什么?
谢谢大家,对不起我的英语:)
您应该了解 CASE
表达式和 CASE
语句之间的区别。这是一个CASE
expression:
CASE
WHEN #PROMPT('SEL_TYPE')# = '%' then 1
WHEN #PROMPT('SEL_TYPE')# = 'ALL' then 1
WHEN e.evt_job = #PROMPT('SEL_TYPE')# then 1
ELSE 0
END = 1
这是一个不完整的CASE
语句(其他数据库支持,如Oracle or MySQL,但SQL服务器不支持):
CASE A
WHEN 'ok' THEN C = 'ok'
WHEN 'bad' THEN C = 'bad'
表达式是可以在赋值的右侧或 SELECT
语句中求值的东西。
语句是可以在命令式语言中使用的命令,即在存储过程中。 CASE
语句(如果数据库支持)就像 IF
语句一样工作。
这意味着有人把事情复杂化了。如果 SQL 服务器有一个布尔数据类型,他们可能只有 then true
、else false
而最后没有比较。但因为这在 SQL 服务器中是不可能的,所以他们替换了 1
和 0
,然后将其与最后的 1
进行比较,使其成为合乎逻辑的比较。
它同样可以写成:
#PROMPT('SEL_TYPE')# = '%' OR
#PROMPT('SEL_TYPE')# = 'ALL' OR
e.evt_job = #PROMPT('SEL_TYPE')#
根本不需要 CASE
表达式。
甚至可能只是 #PROMPT('SEL_TYPE')# IN ('%','ALL',e.evt_job)
,但有些人可能会觉得这有点过于模糊了意图。
所以,
select code, wo_num, desc from table1
where org = #PROMPT('SEL_ORG')# and
CASE
WHEN #PROMPT('SEL_WO_TYPE')# = '%' then 1
WHEN #PROMPT('SEL_WO_TYPE')# = 'ALL' then 1
WHEN e.evt_jobtype = #PROMPT('SEL_WO_TYPE')# then 1 ELSE 0 END = 1
and e.evt_type in (''A,'B')
可以更简单地写成:
select code, wo_num, desc from table1
where org = #PROMPT('SEL_ORG')# and
e.evt_type in (''A,'B') and
(
#PROMPT('SEL_TYPE')# = '%' OR
#PROMPT('SEL_TYPE')# = 'ALL' OR
e.evt_job = #PROMPT('SEL_TYPE')#
)
有人写了一个 CASE
表达式(然后不得不引入 1
和 0
),而他们所需要的只是基本的布尔逻辑。