sql中where后面用case的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql中where后面用case的问题相关的知识,希望对你有一定的参考价值。

在客户界面上有‘往来单位’的选项,我想在后台控制,如果选择了往来单位,则查询结果为选定的往来单位的数据,如果不选则显示所有往来单位的数据。我现在用的格式是:(wldw是数据库中字段,@wldw是客户端传递过来的)
where <其他条件 and>
wldw=(case when @wldw=‘’ then …… else @wldw end)
或者:
wldw=(case when @wldw<>'' then @wldw else …… end )
写省略号的地方不知道怎么写,或者用其他的方法能实现也行。
我试着用
wldw=(case when @wldw<>‘’ @wldw end) and wldw like (case when @wldw=‘’ then '%' end)或者将and换成or,这样不能实现,将运算符=和like放到括号里面也不行。
能解决问题的话把这几十分都送给。

set @bzdw = isnull(@bzdw,’')

where <其他条件 and>
(@wldw=‘’ or @wldw = wldw)
参考技术A wldw=(case when @wldw=‘’ then wldw else @wldw end)
或者:
wldw=(case when @wldw<>'' then @wldw else wldw end )

MySQL中left join on后面的条件和where后面的条件的区别

做项目的时候,遇到的大坑!所以在此记录一下。

大概的sql如下:

select * from `goods` g LEFT JOIN `goods_rel` grl on g.id = grl.case_id LEFT JOIN `user` ur on grl.user_id = ur.id where g.id = 100 and ur.status=0;

  这一段sql的意思大概就是:三张表关联,然后同时user表的status=0,这张表搜出来后,数据显示为空,需要注意g.id=100的这个goods,他的扩展信息表goods_rel里的user_id是null;

select * from `goods` g LEFT JOIN `goods_rel` grl on g.id = grl.case_id LEFT JOIN `user` ur on grl.user_id = ur.id and ur.status=0 where g.id = 100;

  换了一段sql后,发现数据显示出来了:

1.在on后面加条件仅适合用于left join (right join未测,inner join与where类似)
2.不考虑where条件下,left join 会把左表所有数据查询出来,on及其后面的条件仅仅会影响右表的数据(符合就显示,不符合全部为null,on后面紧跟着的是关联语句,后面的and条件只能管到右表!)
3.where后面加条件与左连接本身无关,影响的是连接产生后的数据(上面的例子很好解释,ur.status=0影响的是连接之后产生的数据,因为id=100的这个goods没有userId,所以也就是不满足ur.status=0,被过滤了)
4.所以左连接关注的是左边的主表数据,不应该把on后面的从表中的条件加到where后,这样会影响原有主表中的数据(这里的ur.status=0应该放在on后面,因为这样的话只会影响到右表数据,到那时如果放在where后面相当于影响了三表关联后的中间表!!导致显示为空)

以上是关于sql中where后面用case的问题的主要内容,如果未能解决你的问题,请参考以下文章

SQL 中 where 条件中 in 后面 加 CASE WHEN 语句 报错

灵活多变的SQL-Where后面的case when

MySQL 条件, case when 和 if 方法

SQL:WHERE 子句中的 IF/CASE 语句

Oracle SQL的Where子句中如何写case语句?

where 子句中的 case 语句 - SQL Server