2017-07-17 53 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 ='的問題和案例中的null。任何人都可以糾正查詢嗎?sql中的大小寫問題

回答

1

CASE表達式的問題在於,您正在使用equals運算符將列與可能爲NULL的謂詞進行比較。這不會像預期的那樣運行,因爲NULL比較應該使用IS NULL而不是等於。一種可能的解決方法是將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 

注意:所有這些解決方案假定AddlDataFieldGroupId不能是NULL