根据提供或未提供的参数对 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
,那么您需要进行显式比较,如第一个示例所示。
我使用了 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
,那么您需要进行显式比较,如第一个示例所示。