Использование case когда предложение в значениях вставки - PullRequest
0 голосов
/ 18 февраля 2020

Итак, у меня есть этот оператор вставки, и мне нужно проверить другую таблицу перед установкой столбцов number1 и number2. Я использовал случай, когда оператор в части значений оператора вставки. Есть ли лучший способ сделать это без дублирования кода при установке обоих этих столбцов.

INSERT INTO history (
    user_id
    ,number1
    ,number2
    )
VALUES (
    'user1'
    ,CASE 
        WHEN (
                SELECT user_id
                FROM old_history
                WHERE user_id = 'user1'
                ) IS NOT NULL
            THEN 12.3
        ELSE NULL
        END
    ,CASE 
        WHEN (
                SELECT user_id
                FROM old_history
                WHERE user_id = 'user1'
                ) IS NOT NULL
            THEN 15
        ELSE NULL
        END
    );

Спасибо.

Ответы [ 2 ]

3 голосов
/ 18 февраля 2020

Функции агрегирования удобно возвращать NULL, когда нет совпадений. Итак, я думаю, что это самый простой метод:

INSERT INTO history (user_id, number1, number2)
    SELECT 'user1', MAX(12.3), MAX(15)
    FROM old_history
    WHERE user_id = 'user1';

Использование функций агрегирования MAX() делает этот запрос агрегации, который гарантированно вернет 1 строку. Второй и третий столбцы равны NULL, когда нет подходящих строк.

0 голосов
/ 18 февраля 2020

Попробуйте это:

INSERT INTO history (user_id, number1, number2)
SELECT 
 'user1'
, case when count(1)=1 then 12.3 end
, case when count(1)=1 then 15   end
FROM old_history
WHERE user_id = 'user1';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...