Sql 如何正确使用case语句?如何在where或join表中使用case语句?

Sql 如何正确使用case语句?如何在where或join表中使用case语句?,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我试图用name1替换所有password1=1的显示值,用name2替换password2=1的显示值,而不更改数据库中的实际值。但当我执行代码时,系统返回: “Msg 4145,第15级,状态1,第22行 在预期条件的上下文中指定的非布尔型表达式,接近“Order” 我有: name1、name2、GateCode、password1、password2、state 瑞安,丽莎,132144564,佛罗里达州 布兰登,琼,25324,内华达州1号 利奥,本,3,1,1,华盛顿 输出

我试图用name1替换所有password1=1的显示值,用name2替换password2=1的显示值,而不更改数据库中的实际值。但当我执行代码时,系统返回:

“Msg 4145,第15级,状态1,第22行 在预期条件的上下文中指定的非布尔型表达式,接近“Order”

我有:


  • name1、name2、GateCode、password1、password2、state


  • 瑞安,丽莎,132144564,佛罗里达州

  • 布兰登,琼,25324,内华达州1号
  • 利奥,本,3,1,1,华盛顿
输出我想要的


  • name1、name2、GateCode、password1、password2、state


  • 瑞安,丽莎,132144564,佛罗里达州

  • 布兰登,琼,25324,琼,内华达州
  • 利奥,本,3,利奥,本,华盛顿
这是我的密码:

Select Top 10 
   g.name1 as 'name1'
 , g.name1 as 'name2'
 , c.gateCode as GateCode
 , c.pas1 as 'password1'
 , c.pas2 as 'password2'
 , g.state as 'state'
from guest g
     Left code c
     on g.guest_cdoe = c.guest_code 
Where 
  CASE 
      WHEN password1 = 1 and g.guest_cdoe = c.guest_code
      Then ba.bank_name1
      WHEN password2 = 2 and g.guest_cdoe = c.guest_code
      Then ba.bank_name1
  End
Order by 3

我想这就是你想要的。。。这很难说,但应该给你指出正确的方向。您希望在select语句中使用大小写,而不是where语句

Select Top 10 
   g.name1 as 'name1'
 , g.name2 as 'name2'
 , c.gateCode as GateCode
 , CASE 
      WHEN c.pas1 = 1 and g.guest_cdoe = c.guest_code
      THEN g.name1 
      ELSE c.pas1
   END
 , CASE 
      WHEN c.pas2 = 1 and g.guest_cdoe = c.guest_code
      THEN g.name2 
      ELSE c.pas2
   END
 , g.state as 'state'
from guest g
     Left code c
     on g.guest_cdoe = c.guest_code 
Order by 3

所以我猜guest.guest\u cdoe的名字有误?你可能想解决这个问题。你应该避免按顺序排列。养成这种坏习惯是不好的。如果您或其他人出现并更改select语句的顺序,则输出的顺序将错误。(请参阅最佳实践部分)。或者这个:@Hogan,谢谢你。在修改脚本之后,我已经修复了它。@Sean谢谢你的文章。很好。@Hogan,在我的案例中,是否有必要在案例语句中使用g.guest\u code=c.guest\u代码?输出是相同的,不带g.guest_代码=c.guest_代码。但是哪条路更好?谢谢你,霍根。真管用!您能解释一下为什么我应该在select语句中包含Case语句而不是where子句吗?我可以把它包括在join语句中吗?就像左连接代码c的情况下,当。。。End@baciyan您可以在where子句和join语句中使用它。但在本例中这样做没有意义——在本例中,您希望更改基于逐行条件选择的内容,使其属于select语句。如果你想改变,如果你过滤了一些东西,那么它会在where中,如果你想改变你加入的方式,那么它会在join中。