2017-01-30 33 views
0

我想過濾基於動態創建的列的值,但哪些不工作,請幫我進一步處理。作爲案例創建列當結果不工作在where子句

SELECT proj.is_active,pal.Project_Artifact_Id, 
     CASE WHEN pal.artifact_status IN ('Closed', 'Verified','Rejected') 
       THEN 'COM' 
      WHEN pal.artifact_status IN ('In Progress') 
       AND (pal.due_date = getDate() OR pal.due_date = (Getdate()+2)) 
       THEN 'OD' 
      WHEN pal.artifact_status IN ('In Progress') AND pal.due_date > (Getdate()+2) 
       THEN 'CR' 
     END AS Filter_Status 
FROM Project_Artifact_List pal, 
    Projects proj 
WHERE proj.project_code = pal.Project_Code 
    AND Filter_Status IN ('CR'); 

更新

invalid column name error message comes 
+1

無法篩選認可像那樣,使用CTE或派生表 – TheGameiswar

+0

感謝所有您的答覆和答案。 – sunleo

回答

4

您不能訪問在where子句中的列別名。首先包裹查詢了在派生表:

select * 
from 
( 
    SELECT proj.is_active,pal.Project_Artifact_Id, 
      CASE WHEN pal.artifact_status IN ('Closed', 'Verified','Rejected') 
        THEN 'COM' 
       WHEN pal.artifact_status IN ('In Progress') 
        AND (pal.due_date = getDate() OR pal.due_date = (Getdate()+2)) 
        THEN 'OD' 
       WHEN pal.artifact_status IN ('In Progress') AND pal.due_date > (Getdate()+2) 
        THEN 'CR' 
      END AS Filter_Status 
    FROM Project_Artifact_List pal, 
     Projects proj 
    WHERE proj.project_code = pal.Project_Code  
) dt 
WHERE Filter_Status IN ('CR'); 
+0

我試過這個,但說關鍵字WHERE附近的語法不正確 – sunleo

+0

@sunleo - 你在派生表後面添加了別名'dt'嗎?答案完全有效。還要開始使用'INNER JOIN'而不是舊式逗號分隔連接 –

+0

根據ANSI SQL不需要dt表別名,但某些dbms產品需要dt別名。 – jarlh

2
;with cte as 
(

    SELECT proj.is_active,pal.Project_Artifact_Id, 
      CASE WHEN pal.artifact_status IN ('Closed', 'Verified','Rejected') 
        THEN 'COM' 
       WHEN pal.artifact_status IN ('In Progress') 
        AND (pal.due_date = getDate() OR pal.due_date = (Getdate()+2)) 
        THEN 'OD' 
       WHEN pal.artifact_status IN ('In Progress') AND pal.due_date > (Getdate()+2) 
        THEN 'CR' 
      END AS Filter_Status 
    FROM Project_Artifact_List pal, 
     Projects proj 
    WHERE proj.project_code = pal.Project_Code 

) 
select * from cte 
WHERE Filter_Status IN ('CR') 
+0

工作的很好,謝謝 – sunleo

+0

它可以作爲單個的JDBC調用查詢嗎?通常是我們以前使用的單個sql。 – sunleo

1

CASE完全取決於Project_Artifact_List,您可以使用CROSS APPLY來計算Filter_Status因此它在WHERE

SELECT proj.is_active,pal.Project_Artifact_Id,  
FROM Project_Artifact_List pal 
CROSS APPLY (SELECT 
      CASE WHEN pal.artifact_status IN ('Closed', 'Verified','Rejected') 
       THEN 'COM' 
      WHEN pal.artifact_status IN ('In Progress') 
       AND (pal.due_date = getDate() OR pal.due_date = (Getdate()+2)) 
       THEN 'OD' 
      WHEN pal.artifact_status IN ('In Progress') AND pal.due_date > (Getdate()+2) 
       THEN 'CR' 
     END AS Filter_Status) fs 
    , Projects proj 
WHERE proj.project_code = pal.Project_Code 
    AND fs.Filter_Status IN ('CR');