单次查询根据参数选择是否提供



我使用SqlDataSource,并有一个基于District的选择查询&Zone如下

SELECT a.[committee_id] memberid, a.[membername], a.[memberemail], a.[memberdesignation], a.[membercreatedby],b.districtname AS district,b.districtid,c.zone_name AS zone,c.zoneid
FROM [committee_details] a
LEFT JOIN district_master b on b.districtid=a.districtid
LEFT JOIN zone_master c on c.districtid=a.districtid and c.zoneid = a.zoneid
WHERE (a.[membercreatedby] = 'director') AND ((convert(varchar,a.districtid) LIKE '%2%') AND (convert(varchar,a.zoneid) LIKE '%25%')) ORDER BY a.[committee_id] DESC

这是一个内联查询。我已经尝试了上面的查询,但not able to figure out如何选择基于的条件.

I want ifdistrict如果District &区供应然后根据两者选择&如果没有提供然后选择全部。但应该在单一查询。我该怎么做呢?

首先,修复您的查询,这样您就不会使用无意义的表别名。使用表格缩写!我也会去掉所有的方括号;它们只会使查询更难编写和读取。

基本上,您希望在WHERE子句中与NULL进行比较。我不知道为什么你的示例代码使用LIKE,特别是列似乎是数字。问题中没有解释为什么使用LIKE进行比较,所以思路是:

SELECT cd.committee_id as memberid, cd.membername, 
cd.memberemail, cd.memberdesignation, cd.membercreatedby,
dm.districtname AS district, dm.districtid,
zm.zone_name AS zone, zm.zoneid
FROM committee_details cd LEFT JOIN
district_master dm 
ON cd.districtid = dm.districtid LEFT JOIN
zone_master zm
ON zm.districtid = cd.districtid AND
zm.zoneid = cd.zoneid
WHERE cd.membercreatedby = 'director') AND 
(cd.districtid = @district or @district is null) AND
(cd.zoneid = @zone or @zone is null) 
ORDER BY cd.[committee_id] DESC;

如果你使用的是LIKE,那么我会这样表达逻辑:

WHERE cd.membercreatedby = 'director') AND 
(cast(cd.districtid as varchar(255)) like @district) AND
(cast(cd.zoneid as varchar(255)) like @zone) 

当您希望所有值匹配时,将模式作为'%'传递。这假定cd中的列不是NULL。如果它们可以是NULL,那么您需要显式比较,如第一个示例所示。

如果我的问题是正确的,那么你可以使用参数和比较列本身,如果值没有提供或不存在。

尝试如下:

SELECT a.[committee_id] memberid, a.[membername], a.[memberemail], a.[memberdesignation], a.[membercreatedby],b.districtname AS district,b.districtid,c.zone_name AS zone,c.zoneid
FROM [committee_details] a
LEFT JOIN district_master b on b.districtid=a.districtid
LEFT JOIN zone_master c on c.districtid=a.districtid and c.zoneid = a.zoneid
WHERE (a.[membercreatedby] = 'director') 
AND b.districtname = isnull(nullif(@districtname, ''), b.districtname)
AND c.zone_name = isnull(nullif(@zone_name, ''), c.zone_name)
ORDER BY a.[committee_id] DESC

最新更新