我试图编辑几个月前有人写过的代码,但我无法理解某些部分,例如:
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意味着什么?
谢谢大家,对不起我的英语:)
答案 0 :(得分:4)
您应该了解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或MySQL,但不支持SQL Server):
CASE A
WHEN 'ok' THEN C = 'ok'
WHEN 'bad' THEN C = 'bad'
表达式可以在赋值的右侧或SELECT
语句中进行评估。
语句是可以在命令语言中使用的命令,即在存储过程中。 CASE
语句(如果数据库支持)就像IF
语句一样工作。
答案 1 :(得分:2)
这意味着某人有过于复杂的事情。如果SQL Server有一个布尔数据类型,那么他们可能只有then true
,else false
并且最后没有比较。但是因为在SQL Server中这是不可能的,他们已经替换了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
)。