2016-04-08 31 views
0

WHERE句でCASE文を使用しようとしましたが、動作しませんでした。 ご協力いただきありがとうございます!SQL(SQL Server)のWHERE句のCASE文

SELECT 
... 
FROM ... 
WHERE 
    CASE 
    WHEN @LastName <> '' AND @CardNo <> '' AND @StoreNo <> '' THEN 
     ((m.ApplicantLastName LIKE @LastName AND m.StoreNo = @StoreNo) OR 
     (m.CardNo LIKE @CardNo AND LTRIM(RTRIM(m.ApplicantLastName)) <> '')) 
    WHEN @LastName <> '' AND @CardNo <> '' THEN 
     (m.ApplicantLastName LIKE @LastName OR (m.CardNo LIKE @CardNo AND LTRIM(RTRIM(m.ApplicantLastName)) <> '')) 
    WHEN @LastName <> '' AND @StoreNo <> '' THEN 
     (m.ApplicantLastName LIKE @LastName AND m.StoreNo = @StoreNo) 
    WHEN @LastName <> '' THEN 
     m.ApplicantLastName LIKE @LastName 
    WHEN @CardNo <> '' THEN 
     (m.CardNo LIKE @CardNo AND LTRIM(RTRIM(m.ApplicantLastName)) <> '') 
    END 

答えて

4

これはCASEの間違った使い方です:

(m.CardNo LIKE @CardNo AND LTRIM(RTRIM(m.ApplicantLastName)) <> '') 

あなたは飛行に述語を生成するためにそれを使用することはできません。 CASEのみを使用して値を生成することができます。この値は、WHERE節の値と比較することができます。

0

あなたはこのような何か実行してcaseせずに、あなたのロジックを書き換えることができます。

WHERE ((@LastName = '' AND LTRIM(RTRIM(m.ApplicantLastName)) <> '') OR 
     (m.ApplicantLastName LIKE @LastName) 
    ) AND 
     (@CardNo = '' OR m.CardNo LIKE @CardNo) AND 
     (@StoreNo = '' OR m.StoreNo = @StoreNo) 

このロジックは、多くの場合、代わりに空の文字列のNULLを想定して書かれていることに注意してください:あなたの場合、

WHERE (@LastName IS NULL OR m.ApplicantLastName LIKE @LastName) AND 
     (@CardNo IS NULL OR m.CardNo LIKE @CardNo) AND 
     (@StoreNo IS NULL OR m.StoreNo = @StoreNo) 

とをこれらの列に索引がある場合、最終的な照会で索引を使用できるように動的SQLを検討することができます。

1

パラメータは、フィルタに結合するフィールドがあるため、where句で使用できます。

WHERE 
    (@CardNo='' OR m.CardNo LIKE @CardNo)  
    AND 
    (@LastName='' OR m.ApplicantLastName LIKE @LastName) 
    AND 
    (@StoreNo='' OR m.StoreNo = @StoreNo) 
    AND 
    (@CardNo='' OR LTRIM(RTRIM(m.ApplicantLastName)) <> '') 
0

私は最終的に、それは次のように働いてしまった:

SELECT 
... 
FROM ... 
WHERE 
    CASE 
    WHEN @LastName <> '' AND @BimartNo <> '' AND @StoreNo <> '' AND 
     ((m.ApplicantLastName LIKE @LastName AND m.StoreNo = @StoreNo) OR 
     (m.BimartNo LIKE @BimartNo AND LTRIM(RTRIM(m.ApplicantLastName)) <> '')) THEN 1 
    WHEN @LastName <> '' AND @BimartNo <> '' AND @StoreNo IS NULL AND 
     (m.ApplicantLastName LIKE @LastName OR (m.BimartNo LIKE @BimartNo AND LTRIM(RTRIM(m.ApplicantLastName)) <> '')) THEN 1 
    WHEN @LastName <> '' AND @StoreNo <> '' AND @BimartNo IS NULL AND 
     (m.ApplicantLastName LIKE @LastName AND m.StoreNo = @StoreNo) THEN 1 
    WHEN @LastName <> '' AND @BimartNo IS NULL AND @StoreNo IS NULL AND 
     m.ApplicantLastName LIKE @LastName THEN 1 
    WHEN @BimartNo <> '' AND @LastName IS NULL AND @StoreNo IS NULL AND 
     (m.BimartNo LIKE @BimartNo AND LTRIM(RTRIM(m.ApplicantLastName)) <> '') THEN 1 
    ELSE 0 
    END = 1 

私が学んだ何を、私たちは何をしたい場合:SQLで

WHERE 
    IF A THEN X 
    ELSE IF B THEN Y 

を、それは次のようになります。

WHERE 
    CASE 
    WHEN A AND X THEN 1 
    WHEN B AND Y THEN 1 
    ELSE 0 
    END = 1 

デニス/ lrb /ゴードン:ありがとうすべてのyあなたの入力!