2012-11-16 45 views
1

我有一個表TableX。它包含三列:AINTBINTCVARCHAR(1)(列C的有效值是'A'或'B'列的名稱)。我需要計算其中滿足以下任一條件發生的次數:WHERE子句中的SQL查詢依賴邏輯

  1. CNULL確實包含以A或大於零B更大的價值。或
  2. CNOT NULL(即'A'或'B')並且指定列(AB)中的值是零或NULL

我當前的存儲過程看起來像

CREATE PROCEDURE ispcSomeName @NumOcc INT OUTPUT 
AS 
SELECT COUNT(*) AS [NumOcc] 
FROM TableName 
WHERE (C IS NULL 
     AND ((A IS NOT NULL OR A > 0) OR 
      (B IS NOT NULL OR B > 0))) 
    OR (CritCarType IS NOT NULL 
     AND (CASE SET @TmpColumnName = CritCareType 
       WHEN N'A' THEN (A IS NULL OR A <= 0) 
       WHEN N'B' THEN (B IS NULL OR B <= 0))) 
GO 

的問題是,我需要檢查列C引用。那就是如果C = 'A',我需要檢查A IS NOT NULL OR A <= 0。最後WHERE中的SET顯然存在問題。我有幾種類型的SP作者,我想避免複雜的TSQL,如果我可以幫助它...

如何動態獲取WHERE子句中的相關列的引用?

感謝您的時間。

回答

3
Select Count(*) 
from tab 
where 
(
    C is null and (Coalesce(A,0)>0 or Coalesce(B,0)>0) 
) 
or 
(
    C is not null and Case when C='A' then Coalesce(A,0) 
    when C='B' then Coalesce(B,0) end <=0 
) 
+0

非常感謝您的時間。這看起來不錯。我會盡快測試。再次感謝... – MoonKnight

+0

我對'COALESCE(A,0)'中的零的相關性感到困惑,這是否只是確保A總是選擇在未定義的'CASE'語句中? – MoonKnight

+0

這是在A爲空的情況下選擇的值 例如,條件「確實包含大於零的A或B中的值」所以如果A <= 0則不會滿足,如果A爲NULL則它不會滿足,因爲將會採用0來進行比較 – bummi