#sql #postgresql
#sql #postgresql
Вопрос:
Есть ли способ выполнить вставку в базу данных Postgres с помощью троичной операции?
Я пытаюсь не писать SQL-функцию и не передавать значения current_timestamp с помощью кода. Пытаюсь добиться этого непосредственно в самой инструкции SQL. Возможно ли это?
Видел примеры для запросов select, где я мог бы использовать CASE и WHEN, но ничего для inserts, и я не вижу, чтобы здесь было применимо предложение WHERE.
Совет, если следующее достижимо. Спасибо.
Для значения check_time в следующем я хочу передать current_timestamp или null в зависимости от значения status в том же запросе.
INSERT INTO user(name, age, status, check_time) VALUES (?, ?, ?, current_timestamp);
Я хотел бы изменить приведенное выше на следующее.
Это недопустимая инструкция SQL, но она пытается добиться того, что будет делать эта троичная команда, где она вставляет current_timestamp, когда статус равен 1, иначе вставьте нулевое значение.
INSERT INTO user(name, age, status, check_time) VALUES (?, ?, ?, status == 1 ? current_timestamp : null);
Ответ №1:
Вы можете использовать CASE
выражение, в котором вы снова передаете значение, переданное для столбца status
:
INSERT INTO "user"(name, age, status, check_time)
VALUES (?, ?, ?, CASE WHEN ? = 1 THEN current_timestamp END);
Альтернатива с использованием, INSERT ... SELECT
где вам не нужно передавать status
дважды:
INSERT INTO "user"(name, age, status, check_time)
SELECT t.name, t.age, t.status, CASE WHEN t.status = 1 THEN current_timestamp END
FROM (SELECT ? "name", ? age, ? status) t;
Комментарии:
1. Я не понимаю 1-й запрос. Как он получает значение 1 или что-либо еще, начиная с 4-го вопросительного знака? КОГДА? = 1, Но 4-й вопросительный знак не является статусом.
2. 4-й вопросительный знак снова должен быть статусом. Это то, что я подразумеваю под … где вы снова передаете значение, переданное для статуса столбца .
3. Понял вас. Протестируем это. Найдите 1-й вариант намного чище, хотя предпочли бы не повторять значение status. Спасибо.
4. вместо использования ? , вы, вероятно, можете использовать переменные dollar, такие как
($1, $2, $3, CASE WHEN $3 = 1....
5. Читатели должны знать, что в инструкции CASE есть предложение ELSE, которое вы можете использовать для предоставления альтернативного значения, используемого для when
t.status != 1
. В моем собственном примере что-то вродеSELECT CASE WHEN value IS NULL THEN 0 ELSE value 1 END