2017-01-30 18 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

に認識されますので、Filter_Statusの計算に適用されます使用することができますそのように、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

dtテーブルの別名は、ANSI SQLでは必要ないが、一部のdbms製品では必要です。 – 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は、それはあなたがフィルタリングすることはできません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');