【问题标题】:Replace calculated negative values with 0 in PostgreSQL在 PostgreSQL 中用 0 替换计算出的负值
【发布时间】:2023-02-07 05:13:21
【问题描述】:

我有一个表 my_table:

case_id    first_created  last_paid       submitted_time
   3456    2021-01-27     2021-01-29      2021-01-26 21:34:36.566023+00:00
   7891    2021-08-02     2021-09-16      2022-10-26 19:49:14.135585+00:00
   1245    2021-09-13     None            2022-10-31 02:03:59.620348+00:00
   9073    None           None            2021-09-12 10:25:30.845687+00:00
   6891    2021-08-03     2021-09-17      None

我创建了 2 个新变量:

select *,
       first_created-coalesce(submitted_time::date) as create_duration,
       last_paid-coalesce(submitted_time::date) as paid_duration 
from my_table;

输出:

  case_id    first_created  last_paid       submitted_time               create_duration paid_duration
   3456    2021-01-27     2021-01-29      2021-01-26 21:34:36.566023+00:00     1                3
   7891    2021-08-02     2021-09-16      2022-10-26 19:49:14.135585+00:00     -450            -405
   1245    2021-09-13     null            2022-10-31 02:03:59.620348+00:00     -412            null
   9073    None           None            2021-09-12 10:25:30.845687+00:00     null           null
   6891    2021-08-03     2021-09-17      null                                 null            null

我的问题是如果新变量的值小于 0,我如何用 0 替换它?

理想的输出应该是这样的:

  case_id    first_created  last_paid       submitted_time               create_duration paid_duration
   3456    2021-01-27     2021-01-29      2021-01-26 21:34:36.566023+00:00     1                3
   7891    2021-08-02     2021-09-16      2022-10-26 19:49:14.135585+00:00     0                0
   1245    2021-09-13     null            2022-10-31 02:03:59.620348+00:00     0               null
   9073    None           None            2021-09-12 10:25:30.845687+00:00     null             null
   6891    2021-08-03     2021-09-17      null                                 null             null

我的代码:

select  *,
        first_created-coalesce(submitted_time::date) as create_duration,
        last_paid-coalesce(submitted_time::date) as paid_duration, 
        case
            when create_duration < 0 THEN 0
            else create_duration
        end as QuantityText
from my_table

【问题讨论】:

  • 只需在整个表达式上使用 CASE
  • @PM77-1 你好,非常感谢你的回复,我刚刚用 Case 更新了我的代码,但它仍然不起作用,你能给我更多细节吗,非常感谢!
  • @William 您不能在此级别通过别名引用别名值 - 它们必须更低(在源表、cte、子查询中)。试试greatest()greatest(first_po_created-coalesce(submitted_timestamp::date),0) as create_duration, greatest(last_po_paid-coalesce(submitted_timestamp::date),0) as paid_duration
  • @Zegarek 非常感谢你,它有效,你能把它作为答案发布吗,以便我检查它,谢谢!

标签: postgresql


【解决方案1】:

尝试greatest(your_value,0) - 给定your_value低于00将作为更大的值返回:

select  *,
        greatest(0,first_po_created-coalesce(submitted_timestamp::date)) as create_duration,
        greatest(0,last_po_paid-coalesce(submitted_timestamp::date)) as paid_duration
from my_table

【讨论】:

  • 谢谢你的回答,不管怎样我可以保留create_duration和paid_duration的null值吗,我不想在它为null时将它转换为0,我只想在它小于0时将它转换为0。
【解决方案2】:

如果您计划将 SQL 数据库附加到 ASP.NET 应用程序,您可以创建一个 c# 脚本来查询您的数据库,并使用以下命令:

Parameters.AddWithValue(‘Data You want to change’ ‘0’);

但是,如果您不将 SQL 数据库与 ASP.NET 应用程序一起使用,这将不起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-16
    • 2016-12-04
    • 2022-01-22
    • 2021-10-24
    • 1970-01-01
    • 2015-04-26
    • 2018-10-09
    • 2012-07-01
    相关资源
    最近更新 更多