如何根据下拉多选和文本框输入两个参数过滤SQL查询结果?
现有SQL问题分析
你现有SQL的WHERE条件逻辑拆分后存在逻辑漏洞:
- 要么满足「未选中任何下拉客户,且(未输入客户名 或 客户ID+名称匹配输入内容)」
- 要么满足「客户ID在选中的下拉列表内」
当你同时选中A/B/C且输入A时,第二个条件直接命中所有A/B/C三个ID,完全没触发输入文本的校验逻辑,所以会返回全部选中的客户数据。
修正后SQL
SELECT DISTINCT A.ID, A.NAME, A.DID INTO #TMPTBL FROM MY_LIST A (NOLOCK) WHERE -- 场景1:未选择任何下拉客户的情况 (@CLIST = '' AND (@CNAME='' OR (A.ID + A.NAME) LIKE '%'+@CNAME+'%')) OR -- 场景2:已选择下拉客户的情况 ( A.ID IN (SELECT ListItem FROM GetSplitList(',',@CLIST)) AND -- 输入为空直接返回所有选中项,不为空则额外校验匹配输入内容 (@CNAME = '' OR (A.ID + A.NAME) LIKE '%'+@CNAME+'%') )
逻辑验证
完全匹配你提到的两个业务规则:
- 选中A/B/C且文本框无输入:@CNAME为空,场景2的第二个校验条件直接放行,返回所有在下拉选中列表内的A/B/C
- 选中A/B/C且输入A:仅同时满足「ID在A/B/C列表内」且「ID+名称匹配A」的记录才会返回,仅输出A的相关数据
内容的提问来源于stack exchange,提问作者batwing
相关产品推荐
相关产品推荐

