2011-07-25 20 views
6

ステータス= 1レコードのみを取得したいと考えています。しかし私は私のテーブルにステータスの列を持っていません。だから私はケースを使用して値を導きました...いつ...。しかしwhere節でcaseを使うと構文エラーが出ます。where句の使用方法

私のクエリ

SELECT SQL_CALC_FOUND_ROWS *, 
    CASE 
     WHEN quantity > num_used AND (CURDATE() BETWEEN coupon_start_date AND coupon_end_date) THEN '1' 
     ELSE '0' 
    END AS STATUS 
FROM 
    table_coupon_code 
WHERE 
    (CASE 
     WHEN quantity > num_used AND (CURDATE() BETWEEN coupon_start_date AND coupon_end_date) THEN '1' 
     ELSE '0' 
    END AS STATUS) = '1' AND coupon_status <> '2' 

私はこれをどのように行うことができますか?

答えて

16

は、where句

SELECT SQL_CALC_FOUND_ROWS * , 
    CASE WHEN quantity > num_used AND (CURDATE() BETWEEN coupon_start_date AND coupon_end_date) 
    THEN '1' 
    ELSE '0' 
    END AS STATUS 
FROM table_coupon_code 
WHERE 
CASE WHEN quantity > num_used AND (CURDATE() BETWEEN coupon_start_date AND coupon_end_date) 
    THEN '1' 
    ELSE '0' 
    END = '1' 
AND coupon_status <> '2' 

からAS STATUSを削除しかし、あなたのCASEは本当に不要です。ちょうどあなたがcase文を繰り返したくない場合は

[...] 
WHERE quantity > num_used AND 
CURDATE() BETWEEN coupon_start_date AND coupon_end_date AND 
coupon_status <> '2' 
+0

ありがとうございました – Gowri

+0

しかし、あなたの 'CASE'は本当に不必要です、私の編集した投稿を見てください。 – rabudde

3

ようにあなたが副選択で選択をラップまたはビューを作ることができ、スタンドアローンWHERE条件としてあなたCASE条件を使用しています。 副選択は

select status 
    from (select case 
      when zip like '4321%' then 1 else 0 end as status 
      from adr 
     ) t 
where status = 1; 
0

のようなものである私は、あなたが提供した1と等価であるとして、あなたは、いくつかの他の、より複雑なクエリがあるとします。

SELECT SQL_CALC_FOUND_ROWS * , 
     '1' AS STATUS 
FROM table_coupon_code 
WHERE quantity > num_used 
    AND CURDATE() BETWEEN coupon_start_date AND coupon_end_date 
    AND coupon_status <> '2' 
1

誰もHAVING句を推奨しませんか?

これにより、実際の結果ではなく、選択した列を照会することができます。大文字小文字の区別や関数呼び出しを使用するのに最適