2016-04-13 17 views
0

私が知りたいのは、p.amount is nullcase .. whenに書いた方が良いか、それともWHERE節に書いていますか?CASE .. WHEN句とWHERE句の条件を設定しますか?

ONE:

select *, 
    case when p.amount is null then '1' 
      else (select count(1) 
        from Money_paid mp 
       where mp.post_id = p.id and mp.user_id = :user_id limit 1) 
    end paid 
from Posts p 
where p.id = :post_id 

TWO:

select *, 
     (select count(1) 
     from Money_paid mp 
      where mp.post_id = p.id and 
       mp.user_id = :user_id and 
       p.amount is not null 
     limit 1) paid 
from Posts p 
where p.id = :post_id 

だから、1?

+1

LIMIT 1ですべてを使用する理由? – Quassnoi

+0

何を返そうとしていますか?支払った数または旗?さらに、 'p.amountがnull 'の場合(最初の値は1、2番目の値は0)、戻り値は同じではありません。 –

+0

@GordonLinoffいいえ私は支払った番号を望んでいない、私はちょうどそこに任意の行を確認したいですか? (ただ存在する) – stack

答えて

1

SELECT *, 
     CASE WHEN p.amount IS NULL THEN 1 
     ELSE 
     EXISTS 
     (
     SELECT NULL 
     FROM money_paid 
     WHERE post_id = p.id 
       AND user_id = :user_id 
     ) 
     END 
FROM posts p 
WHERE p.id = :post_id 
+0

なぜ 'SELECT NULL ..'ですか?私はこれらの出力をしたい:ユーザーが支払った場合、または投稿が無料である場合は「1」、無料でない場合はユーザーが支払っていない場合は「0」が必要です。 – stack

+0

@stack:これは 'EXISTS'が扱うものです。 'EXISTS'の中に何があるのか​​は関係ありません。あなたは' SELECT * 'や' SELECT 1'か、あなたが望むものを使うことができます。私はそれに慣れているので、 'SELECT NULL'を使います。 – Quassnoi

+0

私の情報のために、サブクエリの代わりに 'join'を使ってこれを実装することが可能ですか? – stack

1

どちらもありません。これを書くための良い方法はexists使用しています:

select p.*, 
     (case when p.amount is null then 0 -- 0 seems more reasonable than 1 
      when exists (select 1 
          from Money_paid mp 
          where mp.post_id = p.id and mp.user_id = :user_id 
         ) 
      then 1 else 0 
     end) as IsPaidFlag 
from Posts p 
where p.id = :post_id; 

私の傾向は別のcase状態で行くことになります。 2つのバージョンは、おそらく同じ結果に最適化します。ただし、外部相関を持つと、オプティマイザを混乱させる可能性があります。あなたが1つのレコードのみがチェックが必要な場合は実用的な違いは、しかし、あなたはEXISTSCOUNTを置き換えるべきではありませんしているCOALESCEまたはWHERE句でIS NULLチェックを使用するかどうかを

+0

あなたの質問では、投稿が空いていれば出力は' 0'、投稿は無料でユーザがそれを支払っていなかったら出力は '0'です投稿が無料でなく、ユーザーがそれを支払った場合、「1」...!この構造はそれを扱うのが難しいです。私はこの '1、0、1' *(あなたのものは' 0、0、1')*が欲しいです。だから、私は単純にこれを次のように扱うことができます: 'if($ result ['paid'] == 1){それを表示} else {dont show it}' – stack

+0

@stack 。 。答えの中で述べたように、最初の条件に '1'を入れるだけです。私はそれが厄介なことをちょうど見つける。そして、その場合の質問自体はその価値についてあいまいです。 –