Одна условная проверка, затрагивающая несколько (или все) столбцов внутри одной строки - PullRequest
0 голосов
/ 21 мая 2019

То, что я хотел бы сделать, это воздействовать на несколько столбцов всех строк, где, например, column1 > 5 чтобы их значения были изменены или заменены.

Есть ли какой-нибудь элегантный способ выполнить эту условную проверку один раз (при условии, что это сложный оператор) и использовать ее результат для столбцов, используя CASE / WHEN?

Я понимаю, что могу выполнять стандартную фильтрацию, используя сорта WHERE column1 > 5 и UNION, но я хотел бы узнать, есть ли другие доступные варианты (возможно, даже специфичные для MySQL).

Edit:

Как пример:

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 голосов
/ 21 мая 2019

Вы можете использовать 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'
0 голосов
/ 21 мая 2019

Я думаю, что элегантное решение здесь состоит в том, чтобы на каждый столбец влияла 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
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...