2016-08-08 12 views
0

mysqlの各列に対してcase文を使いたい。それぞれのcase文の中のロジックは同じで長いリストです。これを最適に書く方法はありますか? like複数のcase文が同じ論理である場合

case when cond1 
      then 'xyz' as col1, 
       'xyz2' as col2, 
       'uuy' as col3 
     else null 
for all each column end. 
+0

まず、出力時に必要なもの、つまり出力時に必要なデータを明確にします。構造体は何ですか? –

答えて

1

短い答え:いいえ

ロング回答:種類のを。ロジックを関数にラップして再生し、各カラム(該当する場合)を呼び出すか、動的クエリを使用して再生することができます。あなたは本当に怠け者なら最後に

create table t (
alef varchar(100), 
bet varchar(100)); 

set @case := 'case when ''?'' = ''A'' then 1 else 0 end'; 

set @sql := concat('select ',replace(@case,'?','alef'),',',replace(@case,'?','bet'),' from t'); 

prepare stmt from @sql; 

execute stmt; 

;)あなたはinformation_schema.columnsビューを反復処理し、動的S。T.でselect文を作成することができます。 これを考えてみましょう

set @subCase := ''; 
select @subCase := concat(@subCase,replace(@case,'?',column_name),',') from information_schema.columns where table_name = 't'; 

これらのコードはおそらく安全に手順でラップすることができます。

+1

は同じでした。働いた。 – ArslanAnjum

0

UNION ALLの使用を検討することができます。

など。

WITH my_original_resultset AS (...) 
SELECT 
    ... AS col1, 
    ... AS col2, 
    ... AS col3 
FROM my_original_resultset 
WHERE cond1 
UNION ALL 
SELECT 
    ... AS col1, 
    ... AS col2, 
    ... AS col3 
FROM my_original_resultset 
WHERE cond2 

あなたのユースケースとインデックスに応じて、これは(良いか悪いか)パフォーマンスへの影響を持っているかもしれないが、それはあなたが求めている構文に適合します。

0

あなたは結果セット内の列ごとに別個case発現を必要分離場合

case when cond1 then 'xyz' as col1 end, 
     when cond1 then 'xyz2' as col2 end, 
     when cond1 then 'uuy' as col3 end 
1

使用しなければならない:

select (case when cond1 then 'xyz' end) as col1, 
     (case when cond1 then 'xyz2' end) as col2, 
     (case when cond1 then 'uuy' end) as col3 

case式は単一の値のみを返しています。あなたは条件付きで1つ以上の条件に基づいて1列に異なる値を置くためにそれを使用することができます:

select (case when cond1 then 'xyz' 
      when cond2 then 'xyz2' 
      when cond3 then 'uuy' 
     end) as col 
関連する問題