【问题标题】:How to make Second Field Null if First Field has a Value in Oracle SQL如果 Oracle SQL 中的第一个字段有值,如何使第二个字段为空
【发布时间】:2019-02-07 20:59:15
【问题描述】:

我在 ORACLE 中有两个计算列(Ex3 和 EX12)。因此,无论两个字段都有值(例如:ID 118189AC),id 都喜欢将值保留在 EX3 中,但将 EX12 变为 NULL。有什么建议吗?

SELECT *

FROM 
(SELECT ID,

CASE
    WHEN PORT IN ('CAP')
    THEN 3
    ELSE NULL
END AS EX3,

CASE
    WHEN PORT NOT IN ('TEST1', 'TEST2', 'TEST3')
    THEN 12
    ELSE NULL
END AS EX12

FROM LAN.DETAILS)
WHERE (EX3 IS NOT NULL OR EX12 IS NOT NULL)
ORDER BY ID ASC


ID         EX3     EX12
118051PU            12
118052PU            12
118189AC    3       12
118397PU            12
118451AC    3       12
119343AC    3       12
119387PU            12
119484PU            12
119772PU            12
119997PU            12
120320AC    3       12

【问题讨论】:

    标签: sql oracle calculated-columns


    【解决方案1】:

    我想你只想要一个case 表达式:

    select id, ex3,
           (case when ex3 is not null and ex12 is not null then null else ex12 end) as ex12
    . . .
    

    【讨论】:

    • EX12 是否已在 From 子查询中别名为 Caculated 列? Oracle 也不允许您引用其他别名列,因为一切都是并行运行的。不确定我是否正确,但我以前遇到过这些问题。感谢您的建议
    • @Manny 。 . .我不明白你的评论。这两个别名是在子查询中定义的,所以当然可以在外部查询中引用它们,也可以重新定义它们。
    【解决方案2】:

    NVL2(a, b, c) 如果a 不为空,则返回b,否则返回c

    在您的情况下:NVL2(ex3, null, ex12) 将在 ex3 不为空时返回 null。否则它将返回ex12

    https://docs.oracle.com/cd/B12037_01/server.101/b10759/functions096.htm

    【讨论】:

    • 那么这会放在 WHERE 子句中吗?
    • 试过了,效果很好!不得不把它放在 SELECT 子句中。我有多个列需要像这样进行比较,但至少它有效。非常感谢!
    【解决方案3】:

    我最终在 WHERE 子句中创建了一个子查询,该子查询限制了为 EX3 返回的 ID。谢谢大家

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-08
      • 1970-01-01
      相关资源
      最近更新 更多