2016-09-08 6 views
0

2つの列を入力として使用してmysqlのcase式を使用します。これが私がコードを書式化する方法です。すべてのコードスニペットは、開始時にSet @a = 0; Set @b = 0;を使用しますが、これらの値は変更できます。私自身のユースケースには、それぞれ2つ以上の値があります(それぞれ2つ以上)。2つの入力列を持つMySql CASE式

SELECT 
    CASE (@a , @b) 
     WHEN (0 , 0) THEN 'Both zero' 
     WHEN (1 , 0) THEN 'a is 1' 
     WHEN (0 , 1) THEN 'b is 1' 
     WHEN (1 , 1) THEN 'both 1' 
     ELSE NULL 
    END; 

このようにcase文を使用すると、MySqlはError Code: 1241. Operand should contain 1 column(s)をスローします。 参考のために、以下の両方の作業がありますが、私は上記の理由が不思議に思えます。

SELECT 
    IF((@a , @b) = (0 , 0), 
     'Both zero', 
     IF((@a , @b) = (1 , 0), 
      'a is 1', 
      IF((@a , @b) = (0 , 1), 
       'b is 1', 
       IF((@a , @b) = (1 , 1), 'both 1', NULL)))); 

SELECT 
    CASE 
     WHEN (@a , @b) = (0 , 0) THEN 'Both zero' 
     WHEN (@a , @b) = (1 , 0) THEN 'a is 1' 
     WHEN (@a , @b) = (0 , 1) THEN 'b is 1' 
     WHEN (@a , @b) = (1 , 1) THEN 'both 1' 
     ELSE NULL 
    END; 

だから、質問:複数列の比較を行うとき は、私が最初のコードスニペットのようにCASE式を使用することはできますか? もしそうなら、例を挙げてください。そうでない場合は、どうしてですか?

第3の方法は、自分のユースケースでは完全に実行可能ですが、@aと@bがselect文であった場合、それはそうではありません。

  1. 選択文であった場合は、入力を1回だけ実行します。
  2. 任意の入力数に対して簡単に拡張できます。
  3. 入力タイプ(IE(@ a、@ b)=(0、 '!@#$:abc')はチェックする有効なケースです)には関係ありません。
+0

可能ではありません。あなたは 'case'ステートメントに"値のリスト "を持つことはできません。 'case'は1つのSINGLE値をとり、それだけです。 –

答えて

0

CASEの短いバージョンを複数の値で使用することはできません。あなたは別のオプションは、それらを連結することであるAND

CASE 
    WHEN @a = 0 AND @b = 0 THEN 'Both zero' 
    WHEN @a = 1 AND @b = 0 THEN 'a is 1' 
    WHEN @a = 0 AND @b = 1 THEN 'b is 1' 
    WHEN @a = 1 AND @b = 1 THEN 'Both 1' 
    ELSE NULL 
END 

で両方の条件をテストする長いバージョンを使用する必要があります。

CASE CONCAT(@a, @b) 
    WHEN '00' THEN 'Both zero' 
    WHEN '10' THEN 'a is 1' 
    WHEN '01' THEN 'b is 1' 
    WHWN '11' THEN 'Both 1' 
    ELSE NULL 
END 
関連する問題