案例当...然后

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 1ELSE 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 trueelse false 而最后没有比较。但因为这在 SQL 服务器中是不可能的,所以他们替换了 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),而他们所需要的只是基本的布尔逻辑。