情况......那......

时间:2015-09-08 07:05:33

标签: sql sql-server case case-when

我试图编辑几个月前有人写过的代码,但我无法理解某些部分,例如:

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 1ELSE 0

那个1或0的含义是什么?这是我在代码中遗漏的东西,或者1或0意味着什么?

谢谢大家,对不起我的英语:)

2 个答案:

答案 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语句(由其他数据库支持,如OracleMySQL,但不支持SQL Server):

CASE A 
    WHEN 'ok' THEN C = 'ok'
    WHEN 'bad' THEN C = 'bad'

表达式可以在赋值的右侧或SELECT语句中进行评估。

语句是可以在命令语言中使用的命令,即在存储过程中。 CASE语句(如果数据库支持)就像IF语句一样工作。

答案 1 :(得分:2)

这意味着某人有过于复杂的事情。如果SQL Server有一个布尔数据类型,那么他们可能只有then trueelse false并且最后没有比较。但是因为在SQL Server中这是不可能的,他们已经替换了10,然后在最后将其与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表达式(然后必须引入10)。