我的应用程序中有一个搜索字段,并且我正在使用 SQL。
我的应用程序有 3 个独立ComboBox
的 es,允许用户选择他/她想要搜索的内容。
例如,我们有,Name
在搜索字段中,我想选择有 的人或有的人。family name
age
age 20
age 20 and named "john" or other states
那么我应该使用IF
, ELSE
,的一般程序WHERE
来支持所有这些状态吗?
我的应用程序中有一个搜索字段,并且我正在使用 SQL。
我的应用程序有 3 个独立ComboBox
的 es,允许用户选择他/她想要搜索的内容。
例如,我们有,Name
在搜索字段中,我想选择有 的人或有的人。family name
age
age 20
age 20 and named "john" or other states
那么我应该使用IF
, ELSE
,的一般程序WHERE
来支持所有这些状态吗?
假设变量@Age
,@Name
和@FamilyName
SELECT *
FROM tbl
WHERE
(@Age IS NULL OR Age == @Age)
AND (@Name IS NULL OR Name LIKE '%' + @Name + '%')
AND (@FamilyName IS NULL OR FamilyName LIKE '%' + @FamilyName+ '%')
不需要做if。但是如果你想在 sql 中做一个 IF 它是CASE WHEN <true state> THEN <true action> ELSE <false action> END
sql 中 If-Else 的语法是
IF yourconditon
BEGIN
//sql query
END
ELSE
BEGIN
//sqlquery
End
你如何在数据库中执行你的sql?它是数据库中的存储过程,还是您只是将 sql 语句发送到数据库。
如果是第二个,只需在您的 c# 代码中执行 if-then-else 操作并将不同的 sql 语句发送到您的数据库。
您有几个不同的选择,并且建议对两者进行性能测试(一如既往)。
根据使用的参数动态构建 SQL,所以;
declare sqlTxt VARCHAR(max)
delcare params VARCHAR(128)
params = 'Age INT, Name VARCHAR(128), FamilyName VARCHAR(128)'
sqlText = 'SELECT field Name From Table WHERE 1=1'
IF (IS NOT NULL) sqlText += 'AND Age == @Age '
IF (IS NOT NULL) sqlText += 'AND Name LIKE %@Name%'
IF (IS NOT NULL) sqlText += 'AND FamilyName LIKE %FamilyName%'
EXEC sp_executesql @sqlText, @params, @Age = @Age, @Name = @Name, @FamilyName = @FamilyName
使用 Eli Gassert 发布的解决方案。
一般来说,对于较小的查询,您应该可以使用选项 2,但如果您扩展搜索以包含许多不同的参数,请注意“参数嗅探”,这可能会减慢您的速度。
如果性能是一个问题,基本上测试两种方式。
您应该做的是根据用户选择的内容在您的 Windows 项目中创建 SQL。
StringBuilder mySQL = new StringBuilder();
if(Name != "")
mySQL.Append("Name like '%" + Name + "'%");
if(mySQL != "" && (familyName != "" || age != ""))
mySQL.Append(" AND");
if(familyName != "")
mySQL.Append(" familyName like '%" + familyName + "%');
并继续你的其他条件。将 stringbuilder 字符串附加到您的 SELECT 查询中。
string finalSQL = "SELECT * FROM MyTable WHERE " + mySQL.toString();