这个文章改了三四次 没有一次 是对的 就对自己一个总结

数据库的where 条件 是一条一条对应的 比如 where  id=‘cd12’ 上来是所有的条数都去跟cd12 比较 所以当你写case when 语句时候  case when 条件 then true  只有满足这个条件的才会返回 true

 

数据库 oracle

页面如下图

帆软报表 python_数据

当第一次打开页面的时候  入场时间 这个筛选条件控件是没有值的如果是字符串格式 返回的可能是''(但是我在数据库中,他也识别成了null  不知道为啥)

假设入厂时间控件 id 为rc_s(开始时间) rc_e(结束时间)  日期字段为date  表名table(只是举个例子)

finereport 报表规则

帆软报表 python_sql_02

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 )