今天需要处理一个需求:在只通过sql代码的条件下,根据某个字段的值,来确定某个where条件是否生效。
需要修改的sql如下所示:
SELECT
yzmc
FROM
uf_yzbbtz
WHERE
(
dq = '$ssdq1$'
OR dq1 = $ssdq$
OR instr( gxfb, '$ssdq$' )> 0 )
AND 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。