sql语句的where条件中,通过case when做到类似if判断的效果

今天需要处理一个需求:在只通过sql代码的条件下,根据某个字段的值,来确定某个where条件是否生效。

需要修改的sql如下所示:

SELECT
	yzmc
FROM
	uf_yzbbtz 
WHERE
	(
		dq = '$ssdq1$' 
		OR dq1 = $ssdq$ 
		OR instr( gxfb, '$ssdq$' )> 0AND lxyzzt IN ( $yzztyc$ ) 
		AND yzjb IN ( $yzjbyc$ ) 
	AND yzlb = '$yzfl1$' 
	AND sfyx =0

需求是需要根据表单上的值例如 ‘$ssdq$’(这个值是执行sql前就取到),来判断是否需要在where条件中加入以下条件

		(dq = '$ssdq1$' 
		OR dq1 = $ssdq$ 
		OR instr( gxfb, '$ssdq$' )> 0

实现方式是通过case when,实现sql如下图所示:

SELECT
	yzmc
FROM
	uf_yzbbtz 
WHERE
	lxyzzt IN ( $yzztyc$ ) 
	AND yzjb IN ( $yzjbyc$ ) 
	AND yzlb = '$yzfl1$' 
	AND sfyx = 0 
AND
CASE
		WHEN '31742' = '$ssdq$' THEN 1 
		ELSE
			CASE
			WHEN dq = '$ssdq1$' THEN 1 
			WHEN dq1 = '$ssdq$' THEN 1 
			WHEN instr( gxfb, '$ssdq$' ) > 0 THEN 1 
			ELSE 0 
END
END = 1

下面解释一下AND CASE后面的逻辑是如何执行的:
当’31742’ = '$ssdq$'时返回 1 ,代表着整个CASE WHEN 的语句执行完毕,相当于在最后一个AND后面拼接一个1。

当’31742’ = '$ssdq$'不满足条件时执行ELSE中的CASE WHEN,这里面的可以等价于以下条件:

dq = '$ssdq1$' or dq1 = '$ssdq$' or instr( gxfb, '$ssdq$' ) > 0

如果都不满足,就通过ELSE 0 返回 0。

END = 1它的作用是确定当前 CASE 表达式的结果是否等于1,具体来说,CASE 表达式中的嵌套结构是为了根据不同的条件返回不同的值,其中每个 CASE 子句都返回一个 0 或 1 的值,这些值最终通过逻辑运算符(AND、OR)来确定整个表达式的结果。因此,当子句 “END = 1” 被评估为 TRUE 时,表示整个 CASE 表达式的结果为 1,否则结果为 0。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值