Избегать повторения частей кода при выполнении оператора вставки SQL, который берет данные из одной таблицы, изменяет их и вставляет в другую? - PullRequest
0 голосов
/ 19 апреля 2020

Рассмотрим следующий код:

INSERT INTO EXCHANGE_MAIN3
    SELECT 

    CASE Type
        WHEN 'BUY' then
            CASE SUBSTR(MARKET,1,4) 
                WHEN ('NANO') THEN
                    SUBSTR(MARKET,1,4)
                WHEN ('DATA') THEN
                    SUBSTR(MARKET,1,4)  
                ELSE 
                    SUBSTR(MARKET,1,3)
            END
        WHEN 'SELL' then
            CASE SUBSTR(MARKET,LENGTH(MARKET)-4,LENGTH(MARKET))
                WHEN ('NANO') then
                    SUBSTR(MARKET,LENGTH(MARKET)-3,LENGTH(MARKET))
                WHEN ('DATA') then
                    SUBSTR(MARKET,LENGTH(MARKET)-3,LENGTH(MARKET))
                ELSE
                    SUBSTR(MARKET,LENGTH(MARKET)-2,LENGTH(MARKET))
        END
    END     
    AS COIN_BOUGHT,

    CASE Type
        WHEN 'BUY' then
            CASE SUBSTR(MARKET,LENGTH(MARKET)-4,LENGTH(MARKET))
                WHEN ('NANO') then
                    SUBSTR(MARKET,LENGTH(MARKET)-3,LENGTH(MARKET))
                WHEN ('DATA') then
                    SUBSTR(MARKET,LENGTH(MARKET)-3,LENGTH(MARKET))
                ELSE
                    SUBSTR(MARKET,LENGTH(MARKET)-2,LENGTH(MARKET))
        END

        WHEN 'SELL' then
        CASE SUBSTR(MARKET,1,4) 
                WHEN ('NANO') THEN
                    SUBSTR(MARKET,1,4)
                WHEN ('DATA') THEN
                    SUBSTR(MARKET,1,4)  
                ELSE 
                    SUBSTR(MARKET,1,3)
        END

    END     
    AS PAYMETHOD,

    ...

FROM EXCHANGE_RAW_BINANCE;

Там много повторяющихся частей.

SUBSTR(MARKET,1,4) повторяется много.

SUBSTR(MARKET,1,3) повторяется много.

LENGTH(MARKET)-4 повторяется много.

Блок

CASE SUBSTR(MARKET,1,4) 
                WHEN ('NANO') THEN
                    SUBSTR(MARKET,1,4)
                WHEN ('DATA') THEN
                    SUBSTR(MARKET,1,4)  
                ELSE 
                    SUBSTR(MARKET,1,3)
            END

повторяется дважды

Блок

WHEN 'SELL' then
            CASE SUBSTR(MARKET,LENGTH(MARKET)-4,LENGTH(MARKET))
                WHEN ('NANO') then
                    SUBSTR(MARKET,LENGTH(MARKET)-3,LENGTH(MARKET))
                WHEN ('DATA') then
                    SUBSTR(MARKET,LENGTH(MARKET)-3,LENGTH(MARKET))
                ELSE
                    SUBSTR(MARKET,LENGTH(MARKET)-2,LENGTH(MARKET))
        END

повторяется дважды. Есть ли способ не повторять эти куски кода? Любой совет приветствуется. спасибо.

1 Ответ

3 голосов
/ 19 апреля 2020

Вы можете сначала вычислить повторяющиеся выражения CASE в подзапросе, а затем использовать их повторно:

INSERT INTO EXCHANGE_MAIN3
SELECT
    CASE Type WHEN 'BUY' THEN expr1 WHEN 'SELL' THEN expr2 END,
    CASE Type WHEN 'BUY' THEN expr2 WHEN 'SELL' THEN expr1 END,
    ...
FROM
(
    SELECT *,
        CASE SUBSTR(MARKET, 1, 4) WHEN ('NANO') THEN SUBSTR(MARKET, 1, 4)
                                  WHEN ('DATA') THEN SUBSTR(MARKET, 1, 4) 
                                  ELSE SUBSTR(MARKET, 1, 3) END AS expr1,
        CASE SUBSTR(MARKET, LENGTH(MARKET)-4, LENGTH(MARKET))
            WHEN ('NANO') THEN SUBSTR(MARKET, LENGTH(MARKET)-3, LENGTH(MARKET))
            WHEN ('DATA') THEN SUBSTR(MARKET, LENGTH(MARKET)-3, LENGTH(MARKET))
            ELSE SUBSTR(MARKET, LENGTH(MARKET)-2, LENGTH(MARKET)) END AS expr2
    FROM EXCHANGE_RAW_BINANCE
) t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...