2017-07-17 4 views
1
SELECT Id 
FROM dbo.OWL_AddlDataFields 
WHERE CustomerId = @BaseCustomerId 
    AND AddlDataFieldCategoryId = @AddlDataFieldCategoryId 
    AND AddlDataFieldGroupId = CASE 
           WHEN @AddlDataFieldGroupId = 0 THEN NULL 
           ELSE @AddlDataFieldGroupId 
          END 
    AND Name = @DataFieldName 

上記のクエリは結果を返しません。私は上記の質問は、 'AddlDataFieldCategoryId ='とそのケースからのヌルで問題があると思う。誰でもクエリを修正できますか?SQLのcase nullでの問題

答えて

1

CASE式の問題は、列を、等しい演算子を使用するNULLの述語に比較していることです。これは、NULLの比較ではequalsの代わりにIS NULLを使用する必要があるため、期待どおりに動作しません。可能な回避策の1つは、AddlDataFieldGroupIdを数値に結合することです。それで、CASEの式がある数値と別の数値だけを比較していると確信できます。

WHERE ... AND 
COALESCE(AddlDataFieldGroupId, 0) = CASE WHEN 
        @AddlDataFieldGroupId = 0 
             THEN 0 ELSE @AddlDataFieldGroupId END 
1

あなたAddlDataFieldGroupIdがゼロになることができない場合は、まったくCASEを必要としません。これは仕事を行います。

SELECT Id 
FROM dbo.OWL_AddlDataFields 
WHERE CustomerId = @BaseCustomerId 
AND AddlDataFieldCategoryId = @AddlDataFieldCategoryId 
AND AddlDataFieldGroupId = @AddlDataFieldGroupId 
AND Name = @DataFieldName 

AddlDataFieldGroupIdがゼロになることができますが、これを行うことができ、負になることができない場合は、次の

また
SELECT Id 
FROM dbo.OWL_AddlDataFields 
WHERE CustomerId = @BaseCustomerId 
AND AddlDataFieldCategoryId = @AddlDataFieldCategoryId 
AND AddlDataFieldGroupId = CASE WHEN 
@AddlDataFieldGroupId = 0 THEN -1 ELSE @AddlDataFieldGroupId END 
AND Name = @DataFieldName 

、これは関係なく、AddlDataFieldGroupIdができるものの動作します:

SELECT Id 
FROM dbo.OWL_AddlDataFields 
WHERE CustomerId = @BaseCustomerId 
AND AddlDataFieldCategoryId = @AddlDataFieldCategoryId 
AND AddlDataFieldGroupId = CASE WHEN 
@AddlDataFieldGroupId = 0 THEN AddlDataFieldGroupId - 1 ELSE @AddlDataFieldGroupId END 
AND Name = @DataFieldName 

注:これらのソリューションはすべて、AddlDataFieldGroupIdNULLにすることはできません。