我想完成的是影响所有行的多列,例如column1 > 5
来更改或替换其值。
是否有任何优雅的方法可以执行一次此条件检查(假设它是一个复杂的语句),并使用CASE / WHEN
将其结果用于列?
我知道我可以使用WHERE column1 > 5
和UNION
进行标准过滤,但是我想了解是否还有其他选项(甚至可能是特定于MySQL的)。
编辑:
例如:
SELECT
CASE
WHEN Country = 'UK' THEN CustomerId
ELSE '???'
END AS "CustomerId",
CASE
WHEN Country = 'UK' THEN City
ELSE '???'
END AS "City",
CASE
WHEN Country = 'UK' THEN Country
ELSE '???'
END AS "Country"
FROM Customers
如您所见,我在这里要避免使用CASE WHEN Country = 'UK'
多次。
答案 0 :(得分:0)
我认为,这里的一种优雅解决方案是让每一列都受column1
影响,这是它自己的转换函数;
DELIMITER $$
CREATE FUNCTION fn_transformation_for_column2(var_column1 INT)
RETURNS INT
BEGIN
IF (fn_condition(var_column1)) THEN
RETURN 1;
ELSE
RETURN 5;
END IF;
END;
DELIMITER ;
DELIMITER $$
CREATE FUNCTION fn_transformation_for_column3(var_column1 INT)
RETURNS INT
BEGIN
IF (fn_condition(var_column1)) THEN
RETURN 14;
ELSE
RETURN 51;
END IF;
END;
DELIMITER ;
基于共享条件(也可以是一个函数):
DELIMITER $$
CREATE FUNCTION fn_condition(var_column1 INT)
RETURNS BOOLEAN
BEGIN
IF (var_column1 > 5) THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
END;
DELIMITER ;
最后:
SELECT
fn_transformation_for_column2(t.column1) NewColumn2,
fn_transformation_for_column3(t.column1) NewColumn3,
...
FROM table t
;
另一种方法是,所有列都具有相同的转换函数,并根据给定的columntype参数让转换进行处理:
DELIMITER $$
CREATE FUNCTION fn_transformation_for_columns(var_column1 INT, var_column_no INT)
RETURNS INT
BEGIN
IF (var_column1 > 5) THEN
CASE var_column_no
WHEN 2 THEN
RETURN 1;
WHEN 3 THEN
RETURN 14;
ELSE
RETURN 0;
END CASE;
ELSE
CASE var_column_no
WHEN 2 THEN
RETURN 5;
WHEN 3 THEN
RETURN 51;
ELSE
RETURN 0;
END CASE;
END IF;
END;
DELIMITER ;
然后:
SELECT
fn_transformation_for_columns(t.column1, 2) NewColumn2,
fn_transformation_for_columns(t.column1, 3) NewColumn3,
...
FROM table t
;
答案 1 :(得分:0)
您可以使用union all
:
select c.customerid, c.city, c.country
from customers c
where country = 'UK'
union all
select '???', '???', '???'
from customers c
where country is null or country <> 'UK'