Sql 当。。。然后

Sql 当。。。然后,sql,sql-server,case,case-when,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 A WHEN 'ok' THEN C = 'o

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

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 A 
    WHEN 'ok' THEN C = 'ok'
    WHEN 'bad' THEN C = 'bad'
但我举个例子,就是1或者0

1或0是什么意思?这是我在代码中缺少的东西,还是1或0意味着什么


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

你应该理解CASE表达式和CASE语句之间的区别。这是一个:

这是一个不完整的CASE语句,受其他数据库(如或)支持,但不受SQL Server支持:

CASE A 
    WHEN 'ok' THEN C = 'ok'
    WHEN 'bad' THEN C = 'bad'
表达式可以在赋值的右侧或SELECT语句中进行计算


语句是可以在命令式语言(即存储过程)中使用的命令。数据库支持的CASE语句的工作原理与if语句类似。

这意味着有人把事情复杂化了。如果SQL Server有一个布尔数据类型,那么它们可能只有true,否则为false,最后没有比较。但因为在SQL Server中不可能这样做,所以他们将1和0替换为1,然后在最后将其与1进行比较,使其成为逻辑比较

它同样可以写成:

#PROMPT('SEL_TYPE')# = '%' OR
#PROMPT('SEL_TYPE')# = 'ALL' OR
e.evt_job = #PROMPT('SEL_TYPE')#
 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')#
   )
根本不需要大小写表达式

甚至可能只是在“%”、“ALL”、e.evt_job中提示“SEL_TYPE”,但有些人可能会觉得这太模糊了意图

所以

可以更简单地写为:

#PROMPT('SEL_TYPE')# = '%' OR
#PROMPT('SEL_TYPE')# = 'ALL' OR
e.evt_job = #PROMPT('SEL_TYPE')#
 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,而他们所需要的只是基本的布尔逻辑。

我不得不说,代码是报告工具的一部分,因此,在运行报告时,程序会询问提示代码。您不应该在此处直接对自己的问题或答案发表评论-如果您有更多的问题要添加,您可以在问题的底部添加编辑链接,就在标记的下面,T-SQL中没有CASE语句,所以我认为,答案似乎有误导性。是的。刚刚意识到。。。不过,在PL/SQL中也存在一些问题。我会找到答案的。OP说每当我读到。。。也许他们正在阅读关于其他RDBMSI的CASE语句,他们可以理解您所说的,但仍然无法理解我的代码,我将发布一个示例:select code,WOU num,从表1中描述,其中org=PROMPT'SEL\u org'和CASE当PROMPT'SEL\u WO\u TYPE'='%'时,1当PROMPT'SEL\u WO\u TYPE'='ALL'时,1当e.evt\u jobtype=PROMPT'SEL\u WO\u TYPE'时,然后1 ELSE 0 END=1,并且e.evt\u键入A,'B'@Nanaki-注释不是放置代码示例的最佳位置,正如您所经历的那样。但正如我在回答中所说,这只是一个人把事情复杂化了。您可以将整个CASE…END表达式替换为我答案中的任意一个代码示例,尽管您希望将第一个代码示例用括号括起来,因为WHERE子句中还有其他表达式,查询将产生完全相同的结果。谢谢Damien,但我想了解的是案件陈述的结果。它比较同一行上的两个值,并返回1或0,但当它为0或1时会发生什么?@Nanaki-在CASE表达式结束后,它计算的任何值都将与1进行比较。如果案例产生了1,那么该表达式将为真。如果大小写生成了0,则该表达式将为false。他们可以先写'T'然后再写'F',最后再与'T'进行比较-正如我在顶部所说的,他们正在努力解决SQL Server没有布尔数据类型这一事实,因此他们不能只写true和false。而且,正如我所说,对于他们试图做的事情来说,它过于复杂了。但是在我的代码中,为什么需要知道情况是1还是0?我的意思是,当你们比较事物得到一个真或假的值,这是因为若它是真的,你们会做一些事情,若它是假的,你们会做其他事情。但我看不出代码将如何处理这个真值或假值1或0。