问题中的T-SQL案例

时间:2013-07-09 06:58:34

标签: sql sql-server tsql

我试图通过几个bolgs搜索,但是我仍然在使用Where子句中的SQL案例中遇到问题。有人可以帮帮我吗?以下是场景 -

我有一个表Client_Master,我必须创建一个存储过程来显示:

  1. 当用户点击所有单选按钮
  2. 时,所有客户的所有公司
  3. 当用户点击Client1单选按钮
  4. 时,所有特定于Only Client1的公司
  5. 当用户点击Client2单选按钮
  6. 时,所有特定于Only Client2的公司

    我尝试将SQL代码编写为 -

    CREATE PROCEDURE ClientSearchList
    --Exec ClientSearchList
    AS
        SET NOCOUNT OFF
    BEGIN
    Declare @Filter Varchar(10)
    Set @Filter = Null
    SELECT DISTINCT client_Name FROM M_CLIENT_MASTER
    Where case 
    WHEN @Filter = 'ALL' THEN Client_id <> 0 AND Activate = 0
    WHEN @Filter = 'TATA' THEN Client_id <> 0 and Activate = 0 and (Client_Name like '%Tata%' OR   Client_Type=9)
    WHEN @Filter = 'CONCEPT' THEN
    
    IF @@ERROR <> 0 GOTO ERRORHANDLER**
        SET NOCOUNT OFF
        RETURN(0)
    
    ERRORHANDLER:
        RETURN(@@ERROR)
    END
    

    请建议一种方法来实现这一目标。

    谢谢, 维迪亚

2 个答案:

答案 0 :(得分:6)

我不知道为什么刚接触SQL的人似乎只需要CASE 1 ,而他们只需要布尔运算符 - 他们肯定会在其他语言中使用相同类型的运算符:

Where
   (@Filter = 'ALL' AND Client_id <> 0 AND Activate = 0) OR
   (@Filter = 'TATA' AND Client_id <> 0 and Activate = 0 and
        (Client_Name like '%Tata%' OR Client_Type=9)) OR
   (@Filter = 'CONCEPT' AND ... )

问题使CONCEPT分支不完整,所以答案也是如此。此外,前两个分支看起来有一些相似之处,因此可以简化:

Where
   (Client_id <> 0 AND Activate = 0 AND
       (@Filter = 'ALL' OR
           (@Filter = 'TATA' AND
               (Client_Name like '%Tata%' OR Client_Type=9)
           )
       )
   ) OR
   (@Filter = 'CONCEPT' AND ... )

1 CASE表达式 - 它计算单个。这不是某种形式的控制流程。 在SELECT语句中没有任何此类控制流构造。

答案 1 :(得分:0)

也许这对你有用

Select 
ProductID
OrderNo,
OrderType,
OrderLineNo
From Order_Detail
Where ProductID in (
Select Case when (@Varibale1 != '') 
then (Select ProductID from Product P Where .......)
Else (Select ProductID from Product)
End as ProductID
)