单个条件检查影响单行内的多个(或全部)列

时间:2019-05-21 08:05:24

标签: mysql sql

我想完成的是影响所有行的多列,例如column1 > 5来更改或替换其值。

是否有任何优雅的方法可以执行一次此条件检查(假设它是一个复杂的语句),并使用CASE / WHEN将其结果用于列?

我知道我可以使用WHERE column1 > 5UNION进行标准过滤,但是我想了解是否还有其他选项(甚至可能是特定于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'多次。

2 个答案:

答案 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'