我有一个查询
select dim.name as division,dm.name as department, cuser.contractor_name, cuser.contractor_surname,d.status as status,
d.date_submission,cm.name as code,scm.name as subCode,cuser.company_name as company, gt.grade_name as grade, gm.grade_value as gradeValue
from document d, selected_grade_map sgm, selected_grade_details sgd, code_master cm,code_master scm,
contractor_user_master_ipms cuser, department_master dm, division_master dim, grade_master gm, grade_type gt
where
convert(datetime, convert(varchar(10), d.date_submission, 101)) <= convert(datetime, '2011-06-22') AND
convert(datetime, convert(varchar(10), d.date_submission, 101)) >= convert(datetime, '2010-12-22') AND
d.application_status = 'NEW'
and d.status != 'Forked'
and d.id = sgm.doc_id
and sgm.selected_grade_id = sgd.selected_grade_id
and sgd.code_id = cm.code_id
and sgd.sub_code_id = scm.code_id
and d.contractor_user = cuser.id
and d.department_id = dm.id
and d.division_id = dim.id
and sgd.grade_id = gm.grade_id
and gm.grade_type_id = gt.grade_type_id
and d.department_id IN ('%')
and dim.id IN (1,2)
and cm.code_id like '%'
and scm.code_id like '%'
and gt.grade_type_id like '%'
and d.status like '%'
and cuser.reservation_category like '%'
and cuser.company_name like '%'
情况是......
用户可以选择多个条件作为过滤器,但如果用户没有选择任何过滤器,那么我需要通过所有过滤。所以,我尝试在SQL IN中使用%
。但是这里的列是整数所以。它不允许这样做。
查询是静态的,并在iReport
中编写如何在SQL中使用pass all,如
d.department_id IN ('%')
答案 0 :(得分:3)
如果输入为none,你可以给出像-1这样的虚拟值吗?
然后将您的查询转换为
(
d.department_id IN (@Userparam)
OR
(-1) IN (@Userparam) -- If you pass -1 then it returns all user departments
)
答案 1 :(得分:2)
IN
查询将不允许您传递字符串,并且该字符串在任何整数上都不匹配,因为它不在LIKE
中。了解您的iReport如何动态更改此部分查询。
答案 2 :(得分:1)
Like '%'
的黑客攻击甚至可行。您必须研究如何动态更改查询。
如果实际上只有一个整数列要过滤或不过滤,那么您可能会选择两个静态查询(一个具有条件,一个不具有条件)。
答案 3 :(得分:0)
%字符仅适用于LIKE。当你使用=或IN()等时,它就是字面意思。
答案 4 :(得分:0)
如果您想在输入为空时选择所有值,则可以使用COALESCE
所以而不是
cm.code_id like '%'
使用
cm.code_id = COALESCE(@inputvalue, cm.code_id)
COALESCE将选择第一个非空值。因此,如果您输入空值,它将自行选择。
答案 5 :(得分:-1)
您可以尝试使用“BETWEEN”做类似的事情。如果用户输入部门100,则默认为BETWEEN(0,9999)并替换BETWEEN(100,100)。
但是,如果可以在您的环境中使用您的语言,那么最好的建议是为每个查询定制SQL。
如果您处于一个更加受限制的环境中,您只能使用静态SQL,那么使用较少的替换编写三个或四个更简单的查询可能更有意义。