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.
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.
短い答え:いいえ
ロング回答:種類のを。ロジックを関数にラップして再生し、各カラム(該当する場合)を呼び出すか、動的クエリを使用して再生することができます。あなたは本当に怠け者なら最後に
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';
これらのコードはおそらく安全に手順でラップすることができます。
は同じでした。働いた。 – ArslanAnjum
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
あなたのユースケースとインデックスに応じて、これは(良いか悪いか)パフォーマンスへの影響を持っているかもしれないが、それはあなたが求めている構文に適合します。
あなたは結果セット内の列ごとに別個case
発現を必要分離場合
case when cond1 then 'xyz' as col1 end,
when cond1 then 'xyz2' as col2 end,
when cond1 then 'uuy' as col3 end
使用しなければならない:
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
まず、出力時に必要なもの、つまり出力時に必要なデータを明確にします。構造体は何ですか? –