sql—oracle中的第一个负值行

uplii1fm  于 2021-07-27  发布在  Java
关注(0)|答案(3)|浏览(402)

如何使用case语句选取第一个负值行?我不想使用where条件,因为它将条件应用于整个数据。在下面的示例中,我只想将负值(-469)的最大值设为abs(-469),即469,其余的保持不变。
我的 MAX(CASE WHEN -469)... 似乎不起作用。假设有一个排序字段。

Sample 
------
1281
-469
-469
-509
-1359
-1359
-2759
-2829
fwzugrvs

fwzugrvs1#

CASE 与…没有区别 WHERE ,它将根据数据中的每一行进行检查(除非此列上有索引)。所以我能想到的最好的办法就是

UPDATE t
SET Sample = ABS(Sample)
WHERE Sample = (SELECT MAX(Sample) FROM t WHERE Sample < 0)

编辑:只要读到你实际上需要一个“最大负片数”,如果你知道这个值是多少,你可以手动使用 CASE ```
SELECT CASE WHEN Sample = -469 THEN ABS(Sample) ELSE Sample END AS Sample
FROM t

自动执行相同操作(即找到负片的最大值并进行更改):

WITH MaxNeg AS (SELECT MAX(Sample) as v FROM t WHERE Sample < 0)
SELECT CASE WHEN Sample = MaxNeg.v THEN ABS(Sample) ELSE Sample END AS Sample
FROM t

wxclj1h5

wxclj1h52#

如果要更改行中的值。您可以使用以下查询。

update 
    t
set
    sample = abs(sample) 
where 
     sample = (select max(t.sample) from t where t.sample < 0)

但是,如果您只需要检索负片上的最大值的绝对值,那么就可以使用下面的查询。我真的认为那条 where 没有可怕的东西,你可以用它。

select abs(max(t.sample)) from t where t.sample < 0

更新
如果您只能使用select语句,那么下面的决定可以帮助您。

with 
t as 
(
    select 1281 as sample from dual union all
    select -469 as sample from dual union all
    select -469 as sample from dual union all
    select -509 as sample from dual union all
    select -1359 as sample from dual union all
    select -1359 as sample from dual union all
    select -2759 as sample from dual union all
    select -2829 as sample from dual
)
select 
    case 
        when t.sample = (select max(t.sample) from t where t.sample < 0) then
            abs(t.sample)
        else
            t.sample
    end sample            
from 
    t

这个查询的结果是:

sample
-------
1281
469
469
-509
-1359
-1359
-2759
-2829
l3zydbqr

l3zydbqr3#

你可以试试下面的sql,它过滤掉所有的负数。然后按负数降序排列,只选择第一行。

update tab
set tab.val = ABS(tab.val)
WHERE
    tab.val < 0
ORDER BY tab.val DESC;

相关问题