我有一个下拉列表,所有客户名称作为复选框。用户可以勾选复选框选择多个客户。我也有一个文本框,用户可以在客户的名字键入。如果用户从下拉框中选择客户A,B,C,并且没有在文本框中输入任何内容,则结果将显示A,B,C。如果用户从下拉框中选择A、B、C,并在文本框中输入A,语句会检查下拉框中是否也选择了A,结果应该是A。这是我的SQL语句。现在如果我选择A,B,C,然后输入A,它仍然会给我A,B,C。如果我选择A B C并输入A,它应该只给我A。@CLIST保存A,B,C,用逗号作为分隔符。@CNAME持有一个用户键
SELECT DISTINCT A.ID, A.NAME, A.DID
INTO #TMPTBL
FROM MY_LIST A (NOLOCK)
WHERE (@CLIST = '' AND (@CNAME='' OR (A.ID + A.NAME) like '%'+@CNAME+'%'))
OR (A.ID in (SELECT ListItem FROM GetSplitList(',',@CLIST)))
你的逻辑是有缺陷的,对于每个参数你需要检查@param = '' OR @param is-match
SELECT DISTINCT
A.ID, A.NAME, A.DID
INTO #TMPTBL
FROM MY_LIST A
WHERE (
@CNAME = '' OR
A.ID + A.NAME LIKE '%' + @CNAME + '%'
) AND (
@CLIST = '' OR
A.ID IN (SELECT ListItem FROM GetSplitList(',',@CLIST))
);
旁注:
不要在代码中使用NOLOCK
,这不是一个更快的开关
考虑使用表值参数而不是逗号分隔的列表