2016-12-15 7 views
0

THEN句の条件を確認する必要があります。これはCASEの文です。例の下に上記のクエリのsqlserverのCASE文のTHEN句で条件を確認する方法

SELECT * 
FROM SampleTable t 
WHERE 
    CASE 
    WHEN (t.producttypeid = 1) 
     THEN (CAST(CONVERT(NVARCHAR(30), CAST(t.releasedate AS DATETIME), 111) AS DATETIME) >= CAST(CONVERT(NVARCHAR(30), CAST(t.createddate AS DATETIME), 111) AS DATETIME)) 
    WHEN (t.producttypeid IN (2, 3)) 
     THEN (CAST(CONVERT(NVARCHAR(30), CAST(t.createddate AS DATETIME), 111) AS DATETIME) >= CAST(CONVERT(NVARCHAR(30), CAST(t.releasedate AS DATETIME), 111) AS DATETIME)) 
    END 

説明を見つけてください:上記のクエリのWHERE句で、私はproducttypeidをチェックするためcase文を使用して、私はRELEASEDATEとCreatedDateにの日付をチェックする必要がproducttypeidの値に基づいて。

しかし、クエリの上には、構文エラーの下に与える: '>' の近くに

*不正な構文を。

付近に正しくない構文「)」。*

私は2つのselect文と組合と個別の句を使用することにより、上記の課題を達成しました。以下のクエリを見つけてください

SELECT * 
FROM SampleTable t 
WHERE CAST(CONVERT(NVARCHAR(30), CAST(t.releasedate AS DATETIME), 111) AS DATETIME) >= CAST(CONVERT(NVARCHAR(30), CAST(t.createddate AS DATETIME), 111) AS DATETIME)) 
UNION 
SELECT * 
FROM SampleTable t 
WHERE CAST(CONVERT(NVARCHAR(30), CAST(t.createddate AS DATETIME), 111) AS DATETIME) >= CAST(CONVERT(NVARCHAR(30), CAST(t.releasedate AS DATETIME), 111) AS DATETIME)) 

ですので、日付チェックはCASE文に基づいてTHEN句で行う必要があります。

しかし、私は単一の選択クエリで上記のタスクを達成したいと思います。この点について私を助けてください。

ありがとうございます。

+1

あなたは 'releasedate'と' createddate'を保存するためにどのようなデータ型を使用していますか?私は最初に日付に、次に文字列に、二重変換によって少し混乱しています。 –

+0

DateTimeデータ型を使用しています。日付の比較のみをチェックするには二重変換が必要です。私は時間を考慮していない。 – Vijay

+0

'CAST(DateTimeField_1 AS DATE)= CAST(DateTimeField_2 AS DATE)...'のように単純化することができます。読みやすく、入力がすばらしくなければなりません。あなたが@faflがあなたを助けてくれたら[回答を受け入れる]ことを検討してください(http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)。これは寄稿者に報酬を与え、他の人が実際の解決策を見つけるのを助ける。 –

答えて

2

これはブール代数で実現できます。これを試してください:

SELECT * FROM SampleTable t WHERE t.producttypeid IN (1, 2, 3) AND ((
    t.producttypeid = 1 AND (
     CAST(CONVERT(NVARCHAR(30), CAST(t.releasedate AS DATETIME), 111) AS DATETIME) >= CAST(CONVERT(NVARCHAR(30), CAST(t.createddate AS DATETIME), 111) AS DATETIME) 
    ) 
) OR (
    t.producttypeid IN (2, 3) AND (
     CAST(CONVERT(NVARCHAR(30), CAST(t.createddate AS DATETIME), 111) AS DATETIME) >= CAST(CONVERT(NVARCHAR(30), CAST(t.releasedate AS DATETIME), 111) AS DATETIME) 
    ) 
)) 
+0

これは問題ありません。しかし、私もproducttypeidの状態をチェックする必要があります。 – Vijay

+0

最初に私は(1,2,3)のt.producttypeidをチェックしなければなりません。その後、これらの日付の条件をチェックする必要があります。製品タイプIDは5種類ありますが、1,2および3のみを考慮する必要があります。 – Vijay

+0

私は最初に追加チェックを追加しました。しかし、同じ結果が得られるはずです。 – fafl

関連する問題