我可以把if放在where子句中

时间:2014-09-23 12:47:45

标签: sql sql-server

我有一个表客户端,其中包含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语法。

  1. 当用户选择All for 4 combobox
  2. 时的SQL

    SELECT ClientID,Departement,Hour,Tourn 来自客户

    1. 当用户选择客户端X时的SQL,全部用于3个其他组合框
    2. SELECT ClientID,Departement,Hour,Tourn 来自客户 在哪里ClientID = x

      1. 当用户选择Client X和Dept Y时的SQL,以及其他2个组合框的

        SELECT ClientID,Departement,Hour,Tourn 来自客户 WHERE ClientID = x 和部门= Y

      2. 直到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 等等

5 个答案:

答案 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