模糊查询语句的设计
在查询类节点的设计中,经常需要用到模糊查询子句。在这里有一个需要注意的问题,就是真空文本型字段与空字符串字段的区别。
如果一个字段在记录添加后从未编辑过,则该字段为空真空“字段 is null”,如果该字段编辑过后又被清空,则为空字符串“字段=''”。
我们假设一模糊查询语句设计为
select * from 病案录入 where 入院诊断 like '%'+':入院诊断'+'%'
如果用户未输入入院诊断参数,则用户的本意是希望查出所有病案录入中的记录(即忽略入院诊断筛选条件),但由于like子句对于真空(null)字段不起作用,因此,该语句的实际执行结果为所有入院诊断字段不为真空的记录。
因此,我们应该改进该语句,使其更加完善,将字段为真空的情况考虑进去。
select * from 病案录入 where
(iif(':入院诊断'='',(入院诊断 like '%%' or 入院诊断 is null),入院诊断 like '%'+':入院诊断'+'%'))
以上语句通过使用iif判断语句,使得查询语句在参数输入为空的情况下输出为“入院诊断 like '%%' or 入院诊断 is null”,不为空的情况下输出为“入院诊断 like '%'+':入院诊断'+'%'”,在所有可能的情况下,都会输出正确结果。
统计查询尽量避免中间表
统计查询如果可以不用中间表的尽量不用中间表,因单机版升迁到网络版,中间表的数据在网络版的使用中容易出现错误,所以尽量避免在统计查询中使用中间表。
举例:将两个表的数量统计出来显示结果。
借助中间表的方法语句如下:
delete from 数量
go
insert into 数量 (编号,数量)
select 编号,数量1
from 中间表
go
insert into 数量 (编号,数量)
select 编号,数量2
from 表2
go
select 编号,sum(数量) as 数量
from 数量
group by 编号
不借助中间表的语句如下:
select 编号,sum(数量1) + sum(数量2) as 数量
from(
select 编号,sum(数量1) as 数量1,0 as 数量2
from 中间表
group by 编号
union all
select 编号,0,sum(数量2)
from 表2
group by 编号)
as A
group by 编号
以后大家可以灵活运用此类型的语句。
查询
做查询时,有作为查询条件的字段如果不输入数据,有时就查询不出来,下面的语句可以避免这种情况,以下是两个条件的情况,如果多于三个条件就不能用这种方式了。
两个条件的单机版:
where iif((':驾驶证档案编号' is null or ':驾驶证档案编号'=''), iif((':身份证号' is null or ':身份证号'=''),
((驾驶证档案编号 is null or 驾驶证档案编号='') and (身份证号 is null or 身份证号='')),
身份证号=':身份证号'),
iif((':身份证号' is null or ':身份证号'=''),驾驶证档案编号=':驾驶证档案编号',(驾驶证档案编号=':驾驶证档案编号' and 身份证号=':身份证号')))
网络版:
where 拼音代码 like (case when ':拼音代码' is null or ':拼音代码'='' then (case when ':辖区名称' is null or ':辖区名称'='' then ':拼音代码' else '%:拼音代码%' end)
else '%:拼音代码%' end) and
辖区名称 like (case when ':辖区名称' is null or ':辖区名称'='' then (case when ':拼音代码' is null or ':拼音代码'='' then ':辖区名称' else '%:辖区名称%' end)
else '%:辖区名称%' end)
三个条件的:
where iif((':牌照号' is null or ':牌照号'=''), iif((':营运证号' is null or ':营运证号'=''),
iif((':卡号' is null or ':卡号'=''), ((牌照号 is null or 牌照号='') and (营运证号 is null or 营运证号='') and (卡号 is null or 卡号='') ) ,
卡号=':卡号'),
iif((':卡号' is null or ':卡号'=''), 营运证号=':营运证号',
(营运证号=':营运证号' and 卡号=':卡号'))), i
if((':营运证号' is null or ':营运证号'=''), iif((':卡号' is null or ':卡号'=''),牌照号=':牌照号',(牌照号=':牌照号' and 卡号=':卡号')), iif((':卡号' is null or ':卡号'=''),
(牌照号=':牌照号' and 营运证号=':营运证号'), (牌照号=':牌照号' and 营运证号=':营运证号' and 卡号=':卡号'))))