这个文章改了三四次 没有一次 是对的 就对自己一个总结
数据库的where 条件 是一条一条对应的 比如 where id=‘cd12’ 上来是所有的条数都去跟cd12 比较 所以当你写case when 语句时候 case when 条件 then true 只有满足这个条件的才会返回 true
数据库 oracle
页面如下图
当第一次打开页面的时候 入场时间 这个筛选条件控件是没有值的如果是字符串格式 返回的可能是''(但是我在数据库中,他也识别成了null 不知道为啥)
假设入厂时间控件 id 为rc_s(开始时间) rc_e(结束时间) 日期字段为date 表名table(只是举个例子)
finereport 报表规则
select * from table where to_char(date,'yyyy-mm-dd') between '${rc_s}' and '${rc_e}' (这么写可能很垃圾但是很爽)
如果正巧没有传进来值 页面是不展示的 要求是 打开页面展示全部的数据 添加条件在展示条件数据
(想过赋值控件初始值,呵呵我没找到咋赋值 也不会也不想找api了)
解决方案 如果是’‘ 或者null 值时 只要将这个空值 赋值成该字段的值就可以了
case when 比较好把 毕竟mysql 也可以
select * from table where
decode('${rc_s}',NULL,to_char(date,'yyyy-mm-dd'),'${rc_s}')<=to_char(date,'yyyy-mm-dd') and
decode('${rc_e}',NULL,to_char(date,'yyyy-mm-dd'),'${rc_e}')>=to_char(date,'yyyy-mm-dd')
我知道没人这么写代码因为没必要,人家都用动态sql,xml文件(现在想要查询的数据是 规定时间段内 的数据 若 一个为空就查全部,上面decode 这种写法 会导致 例如开始时间是空 他查出的数据就是 结束时间之前的所有数据 结束之后的数据是不是展示的 丢失了 结束时间之后的数据 )
oracle 无法写case when 条件 then true(这个true 不允许写 )
where 条件里面再添加 if这种判断条件 本来就是有病 只能想别的办法解决
1 对控件赋值初始值(我将finereport 输出改成了info 发现 打印出来sql 还是不会获取到 控件的值(我是6.5 ) 我根本不懂这个报表机制 就这样吧 )
2 (null 和 你给的条件比较 是false 比如 A字段 (字段内容是‘’ 或者 null ) A LIKE '%%' 是查不到任何数据 ) 所以要对字段 添加非空 nvl(A,'%') (前面还有个条件 因为这个字段是空的 所以我的日期也炸了 )
-- 现在有一张 A表 A表字段为 T date 时间类型 查询指定时间段 内数据
-- 指定的时间段变量为 s 和 e s和e 可能都是空的
SELECT T FROM A WHERE (T BTWEEN '${S}' AND '${E}' OR S IS NULL OR E IS NULL )