基于参数选择的单个查询(如果或未提供)

Posted

技术标签:

【中文标题】基于参数选择的单个查询(如果或未提供)【英文标题】:Single Query To Select Based On Parameters If Or not supplied 【发布时间】:2021-11-05 22:54:16 【问题描述】:

我使用过SqlDataSource 并有一个基于DistrictZone 的选择查询,如下所示

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 如何选择基于条件

我想如果 district 提供然后根据 District 选择,如果同时提供 District & Zone 然后根据两者选择如果 nothing 提供然后全选。但应该在单个查询中。我该怎么做?

【问题讨论】:

Bad Habits to Kick : Declaring VARCHAR without (length)。还有Bad Habits to Kick : Using table aliases like (a, b, c) or (t1, t2, t3) 【参考方案1】:

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

基本上,您希望在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,那么您需要一个明确的比较,如第一个示例所示。

【讨论】:

【参考方案2】:

如果我的问题是正确的,那么您可以使用参数并在未提供或不存在值的情况下与列本身进行比较。

尝试以下方法:

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

【讨论】:

以上是关于基于参数选择的单个查询(如果或未提供)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用基于先前Form的继承参数的SQL查询填充WinForm字段?

Oracle PL/SQL 中基于参数的选择查询

如何编写基于组合框选择的单个 sql 查询?

Firebase Firestore - 基于“where”查询参数的安全规则

基于 Azure 流分析 T-SQL 查询中的另一个参数动态拆分参数

tt语音请求缺少或未设置appid