【问题标题】:CASE WHEN ... THEN案例当……那么
【发布时间】:2015-09-08 07:05:33
【问题描述】:

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

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 意味着什么?

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

【问题讨论】:

  • 我不得不说,代码是报表工具的一部分,所以#PROMPT 代码是程序在运行报表时询问的内容。
  • 您永远不需要在此处直接对您自己的问题或答案发表评论 - 如果您有更多要添加的内容,您可以edit您的问题(也总是问题底部的编辑链接,就在标签下方)

标签: sql sql-server case case-when


【解决方案1】:

您应该了解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 语句类似。

【讨论】:

  • T-SQL 中没有CASE 语句,所以我认为回答好像存在误导。
  • 是的。刚刚意识到......不过,PL/SQL 中有。将修复答案。 OP 说“每当我读到”...也许他们正在阅读其他 RDBMS 的 CASE 声明
【解决方案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 表达式(然后不得不引入1s 和0s)。

【讨论】:

  • 我能理解你在说什么,但还是看不懂我的代码,我发个例子: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 和 e.evt_type in (''A,'B')
  • @Nanaki - cmets 不是放置代码示例的最佳位置,正如您所经历的那样。但正如我在回答中所说,这只是某人把事情复杂化了。您可以将整个CASE...END 表达式替换为我的答案中的任何一个代码示例(尽管您也想用() 括号括起第一个表达式,因为WHERE 子句中还有其他表达式)和查询会产生完全相同的结果。
  • 谢谢达米安,但我想了解的是 CASE 声明的结果。它比较同一行上的两个东西,并返回 1 或 0,但是当它是 0 或 1 时会发生什么?
  • @Nanaki - 在CASE 表达式结束后,它计算的任何值都会与1 进行比较。如果案例产生了1,那么该表达式将为真。如果案例产生了0,那么该表达式将为假。他们本可以编写 THEN 'T'ELSE 'F',然后在最后与 'T' 进行比较——正如我在顶部所说的那样,他们正在解决 SQL Server 没有布尔数据类型所以他们不能只需写truefalse。而且,正如我所说,他们想要做的事情过于复杂。
  • 但是在我的代码中,为什么需要知道 CASE 是 1 还是 0?我的意思是,当你比较事物以获得真或假值时,这是因为如果它是真的你会做某事,如果它是假的你会做其他事情。但我看不出代码将如何处理这个真或假(1 或 0)值。
猜你喜欢
  • 2014-08-06
  • 2018-09-18
  • 2020-11-22
  • 1970-01-01
  • 2012-08-28
  • 2020-02-22
  • 2019-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多