我想在mysql中为每一列使用case语句。每个case语句的内部逻辑是相同的,这是一个长列表。有没有办法以最佳方式写出来。像
case when cond1
then 'xyz' as col1,
'xyz2' as col2,
'uuy' as col3
else null
for all each column end.
答案 0 :(得分:1)
结果集中的每一列都需要单独的case
表达式:
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
表达式只返回一个值。您可以根据一个或多个条件使用它在一个列中有条件地放置不同的值:
select (case when cond1 then 'xyz'
when cond2 then 'xyz2'
when cond3 then 'uuy'
end) as col
答案 1 :(得分: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';
这些代码可能安全地包含在程序中。
答案 2 :(得分:0)
您可以考虑使用UNION ALL。
E.g。
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
根据您的使用案例和索引,这可能会影响性能(好的或坏的),但它符合您要求的语法。
答案 3 :(得分:0)
您必须使用分隔的案例
case when cond1 then 'xyz' as col1 end,
when cond1 then 'xyz2' as col2 end,
when cond1 then 'uuy' as col3 end