我使用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