我有一个表客户端,其中包含My Client Server 2008 R2中的ClientID,Departement,Hour,Tourn列。 在我的C#代码中,我有4个Combobox选择值ClientID,Departement,Hour,Tourn。
值Combobox客户端:
-- all
-- 457896
-- 85446
-- etc
价值或部门:
-- all
-- 44
-- 85
-- etc
同样也是锦标赛
小时的值:
-- all
-- 09:00
-- 12:00
-- 15:00
-- 18:00
有4个值意味着很多组合。当我的数学很好时,有16个组合。 当然我可以编写16种SQL语法。
SELECT ClientID,Departement,Hour,Tourn 来自客户
SELECT ClientID,Departement,Hour,Tourn 来自客户 在哪里ClientID = x
当用户选择Client X和Dept Y时的SQL,以及其他2个组合框的
SELECT ClientID,Departement,Hour,Tourn 来自客户 WHERE ClientID = x 和部门= Y
直到16 SQL。在C#代码中我使用switch选择与我的4个组合框选择器相对应的SQL语法。
我想知道我是否可以在1 sql中放入16个sql语法,如下所示:
SELECT ClientID, Departement, Hour, Tourn
FROM Client
WHERE -- if @ClientID is not null then ClientID = @ClientID else not use clientid citere
AND Tourn= @LIB_TOURNE -- same as above
AND -- same as above(substring(Departement,0,3) IN (SELECT ParsedString From dbo.ParseStringList(@Departement)))
AND -- same as abovedatepart(hh, Hour) <=12
我不熟悉SQL,不知道吗?
这意味着当用户选择client = ALL时,我不需要WHERE ClientID = X, 这意味着当用户选择Departement = ALL时,我不需要WHERE Departement = y 等等
答案 0 :(得分:3)
使用COALESCE功能
参考:http://msdn.microsoft.com/en-au/library/ms190349.aspx
SELECT ClientID, Departement, Hour, Tourn
FROM Client
WHERE ClientID =COALESCE (@ClientID, ClientID)
COALESCE就是这样:
ClientID =COALESCE (@ClientID, ClientID)
表示:
ClientID =
case when @ClientID is null then ClientID
else @ClientID
因此,如果@ClientID为null,则过滤器为ClientID = ClientID,这意味着它将默认匹配
答案 1 :(得分:1)
这个解决方案有什么不好的?你只需要处理4个案例,而不是16个案例!?
string strSQL = "SELECT ClientID, Departement, Hour, Tourn FROM Client WHERE 1=1";
if(first_checkbox) {
strSQL += " AND ClientID=@ClientID";
add value for parameter @ClientID;
}
if(second_checkbox) {
strSQL += " AND Departement=@Departement";
add value for parameter @Departement;
}
...
当然你可以摆脱&#34; 1 = 1&#34;如果你跟踪当前条件是否是第一个添加。
答案 2 :(得分:0)
你可以这样做:
SELECT ClientID, Departement, Hour, Tourn
FROM Client
WHERE
(@ClientID = ClientID or @ClientID is null)
and ( another condition in the same manner)
and ( another condition in the same manner)
and ( another condition in the same manner)
假设在组合框中选择“全部”时将null传递给适当的参数值
答案 3 :(得分:0)
看看这是否适合你。
SELECT ClientID, Departement, Hour, Tourn
FROM Client
WHERE (( @CLientID is null ) OR (( @ClientID is not null ) and ( @ClientId = ClientId)))
AND (( @Department is null ) OR (( @Department is not null ) and ( @Department = Department)))
AND (( @Hour is null ) OR (( @Hour is not null ) and ( @Hour = Hour)))
AND (( @Tourn is null ) OR (( @Tourn is not null ) and ( @Tourn = Tourn)))
答案 4 :(得分:0)
你可以试试这个。
SELECT ClientID, Departement, Hour, Tourn
FROM Client
WHERE
1 = CASE
WHEN @ClientID IS NOT NULL
THEN CASE
WHEN ClientID = @ClientID
THEN 1
ELSE 0
END
ELSE 1
END
AND 1 = CASE
WHEN @LIB_TOURNE IS NOT NULL
THEN CASE
WHEN Tourn= @LIB_TOURNE
THEN 1
ELSE 0
END
ELSE 1
END
AND -- same as abovedatepart(hh, Hour) <=12