使用IN SQL传递%

时间:2011-06-22 05:52:13

标签: sql

我有一个查询

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 ('%')

6 个答案:

答案 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将选择第一个非空值。因此,如果您输入空值,它将自行选择。

COALESCE Article

答案 5 :(得分:-1)

您可以尝试使用“BETWEEN”做类似的事情。如果用户输入部门100,则默认为BETWEEN(0,9999)并替换BETWEEN(100,100)。

但是,如果可以在您的环境中使用您的语言,那么最好的建议是为每个查询定制SQL。

如果您处于一个更加受限制的环境中,您只能使用静态SQL,那么使用较少的替换编写三个或四个更简单的查询可能更有意义。