【问题标题】:How to perform Ternary operation in an SQL Insert statement如何在 SQL 插入语句中执行三元运算
【发布时间】:2020-08-16 00:03:11
【问题描述】:

有没有办法通过使用三元操作对 Postgres 数据库执行插入操作?

我试图不编写 SQL 函数,也不通过代码传递 current_timestamp 值。 试图直接在 SQL 语句本身中实现这一点。这可能吗?

看到了选择查询的示例,我可以使用 CASE 和 WHEN 但没有任何插入,而且我没有看到 WHERE 子句适用于此。

如果以下是可以实现的建议。谢谢。

对于下面check_time的值,我想根据同一个查询中status的值传入current_timestamp或者null。

INSERT INTO user(name, age, status, check_time) VALUES (?, ?, ?, current_timestamp);

我希望将上面的内容修改为以下内容。

这不是一个有效的 SQL 语句,但试图实现这个三元组在状态为 1 时插入 current_timestamp 时会执行的操作,否则插入空值。

INSERT INTO user(name, age, status, check_time) VALUES (?, ?, ?, status == 1 ? current_timestamp : null);

【问题讨论】:

    标签: sql postgresql


    【解决方案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; 
    

    【讨论】:

    • 我不明白第一个查询。它如何从第 4 个问号中获得值 1 或任何值?什么时候 ? = 1,但第四个问号不是状态。
    • 第四个问号必须是状态。这就是我所说的 ...在这里您再次传递为列状态传递的值
    • 知道了。将测试它。尽管宁愿不重复状态值,但找到第一个选项更清晰。谢谢。
    • 不使用 ?,您可以使用美元变量,例如 ($1, $2, $3, CASE WHEN $3 = 1....
    • 请读者注意 CASE 语句有一个 ELSE 子句,您可以使用它来提供备用值,以便在 t.status != 1 时使用。在我自己的示例中,类似于SELECT CASE WHEN value IS NULL THEN 0 ELSE value + 1 END
    猜你喜欢
    • 2019-11-08
    • 2015-02-03
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 2016-04-25
    • 2016-06-28
    • 1970-01-01
    相关资源
    最近更新 更多