【问题标题】:Custom column in Oracle/SQL/My-Sql Query?Oracle/SQL/My-Sql 查询中的自定义列?
【发布时间】:2021-11-14 19:08:33
【问题描述】:

我已经准备好数据库,如下图所示,绿色列是我在从 SQL/Oracle 查询数据时需要生成的自定义列。

逻辑:如果 Actual_Completion_Date 不是空/null,则带 Actual_Completion_DateCompletion_Date 否则得到 Completion_Date 列中的 Schedule_Completion_Date

在没有存储过程帮助的情况下,在 SQL 查询中定义列名时,我应该在哪里编写 If 语句。

【问题讨论】:

  • 结束逻辑的情况
  • 能否请您详细说明,假设我是查询部分的新蜜蜂
  • 这是 reference 到 case 语法。
  • COALESCE(Actual_Completion_Date,Schedule_Completion_Date)AS Completion_date
  • 您需要澄清一下 - 您的“自定义列”是表中的某种实际列,还是只是查询输出中的“列”?

标签: mysql sql oracle


【解决方案1】:

您可以在查询的 SELECT 子句中简单地执行此操作。例如在 mysql 中使用这样的 IF() 函数:

SELECT Activity_Details, Actual_Completion_Date, Schedule_Completion_Date, IF(Actual_Completion_Date IS NOT NULL, Actual_Completion_Date, Schedule_Completion_Date) AS Completion_Date
FROM tbl;

IF 函数将返回 True 或 False 的条件作为第一个参数。如果条件计算结果为真,则返回第二个参数,如果计算结果为假,则返回第三个参数。

在 Oracle 或 Microsoft SQL 服务器中,您可以在查询的 SELECT 子句中执行类似的操作,但使用 CASE WHEN ... THEN ... ELSE ... END

【讨论】:

    【解决方案2】:

    如果两个日期字段都包含 NULL 值,则只需使用 COALESCE()。如果第一个是 NULL,那么如果它不是 NULL,则将显示第二个值。如果第一个不为空,则显示第一个值。

    SELECT Activity_Details, Actual_Completion_Date
         , Schedule_Completion_Date
         , COALESCE(Actual_Completion_Date, Schedule_Completion_Date) AS Completion_Date
    FROM tbl;
    

    【讨论】:

      【解决方案3】:

      Oracle(和 MySQL)都支持生成的列。这意味着您可以将逻辑添加为表定义的一部分。我不确定这是否是您要求的,但在 Oracle 中,这看起来像:

      alter table t add column completion_date date generated always as
           (coalesce(Actual_Completion_Date, Schedule_Completion_Date)) virtual;
      

      这将在查询该表并且可用于使用该表的任何查询时计算。

      【讨论】:

        猜你喜欢
        • 2018-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-01
        • 2013-06-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多