【问题标题】:Subtracting a value in a column based on condition using PLSQL使用 PLSQL 根据条件减去列中的值
【发布时间】:2019-12-12 12:54:47
【问题描述】:

我相信这是一件简单的事情。
假设我有一张桌子:

CREATE TABLE kpi
( KPI_ID number(10) NOT NULL,
  KPI_NAME varchar2(50) NOT NULL,
  DAY_DATE DATE
);

而且我知道有人犯了一个错误,在创建表时将所有高于 100 的值加了 100。
我需要一个查询,从 KPI_ID 列中大于 100 的所有值中减去 100。
而且我只能访问读取模式

【问题讨论】:

    标签: sql oracle subtraction


    【解决方案1】:

    有人搞错了,在建表的时候把所有大于100的值都加了100……我需要小于100的值保持原样,大于等于100的应该是减少 100

    您需要有条件地对 KPI_ID 进行调整。为此,我们使用case() 语句:

    select case when (kpi_id - 100) >= 100 then 
             kpi_id - 100 
           else
             kpi_id 
           end as kpi_id
           , kpi_name
           , day_date
    from kpi
    ;
    

    在您最初的问题中,您说“KPI_ID 列中的所有值 >100”,但在您最新的评论中,您说 “大于或等于 100”。我修改后的解决方案实现了您评论中的算法,假设最近提出的要求总是正确的。

    【讨论】:

    • 我需要小于100的值保持原样,大于等于100的值要减100
    【解决方案2】:

    使用update。您拥有的唯一数字是kpi_id,所以我假设您指的是该列:

    update kpi
        set kpi_id = kpi_id - 100
        where kpi_id > 100;
    

    如果您只想查询:

    select kpi_id - 100 as kpi_id, kpi_name, day_date
    from kpi;
    

    【讨论】:

    • @NikitaPronin 。 . .您将使用select 查询。但是如果数据有误,数据应该是固定的。
    【解决方案3】:

    “从 KPI_ID 列中大于 100 的所有值中减去 100 的查询”

    SELECT KPI_ID-100 as KPI_ID,KPI_NAME,DAY_DATE  FROM kpi WHERE KPI_ID >100 
    

    【讨论】:

    • isnull() 不是 Oracle 函数。标记为[oracle] 的问题需要针对该平台的解决方案。 ([sql]标签的使用仅仅表明这个问题是关于编写数据库查询的;并不意味着这个问题是关于MS SQL Server的,这由[sql-server]标签表示)。
    • 哦抱歉我错过了。
    【解决方案4】:

    最后只需要一个 CASE 语句:
    CASE WHEN KPI_ID > 100 then (KPI_ID -100) ELSE KPI_ID END AS KPI_ID

    【讨论】:

      猜你喜欢
      • 2021-01-15
      • 1970-01-01
      • 1970-01-01
      • 2020-02-24
      • 2020-01-12
      • 1970-01-01
      • 2021-09-10
      • 2021-12-03
      • 1970-01-01
      相关资源
      最近更新 更多