Как выполнить троичную операцию в инструкции SQL Insert

#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