根据提供或未提供的参数对 Select 的单个查询

Single Query To Select Based On Parameters If Or not supplied

我使用了 SqlDataSource 并有一个基于 District & Zone 的 select 查询,如下所示

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 如何 Select 基于条件 .

我想要如果 district 供应那么 Select 根据 District,如果同时供应 District & Zone 那么 Select 根据两者 & If nothing supplied then Select All.但应该在单个查询中。我应该怎么做?

如果我答对了问题,那么如果未提供或不存在值,您可以使用参数并与列本身进行比较。

尝试以下操作:

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

首先,修复您的查询,以免使用无意义的 table 别名。使用 table 缩写!我也会放弃所有的方括号;它们只会让查询更难编写和阅读。

基本上,您需要与 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,那么您需要进行显式比较,如第一个示例所示。