【问题标题】:Converting SQL Server query to Oracle - specific cases here将 SQL Server 查询转换为 Oracle - 具体案例在这里
【发布时间】:2012-01-23 21:04:03
【问题描述】:

我正在将一个 300 行的 sql server 查询转换为 Oracle,有些语句让我卡住了,这里的任何帮助都会很棒:

1. SELECT L_SPLIT_DATE = NULLIF(SPLIT_DATE, CONVERT(DATETIME, '20000101', 112)) + 1
    FROM OGEN.GEN_P_ARCHIVE

 ----- Not sure about NULLIF and CONVERT. Datetime i think has to become DATE.

2. IF @@ROWCOUNT = 0  

   ---- 2 "@' signs, do I just remove them both?

3. SET @L_EDT = DATEDIFF(dd, 0, DATEADD(dd, 0, @P_EDT)) + (@L_EDT - DATEDIFF(dd, 0, DATEADD(dd, 0, @L_EDT))) + CASE WHEN @L_SDT > @L_EDT THEN 1 ELSE 0 END;

DATEDIFF、DATEADD,在Oracle中是一样的吗?

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    至于SELECT

    SELECT NVL(SPLIT_DATE, TO_DATE ('20000101', 'YYYYMMDD')) + 1 AS L_SPLIT_DATE FROM OGEN.GEN_P_ARCHIVE
    

    至于ROWCOUNT,这有点复杂——没有很难回答的上下文。

    至于DATEDIFFDATEADD - 在Oracle 中您可以只使用-+,Oracle 将操作数分别解释为DATE 和“天数”(可以是浮点数)。

    【讨论】:

    • 感谢叶海亚的帮助。这样我就可以离开 datediff/add 或者我应该更改它们?
    • @PinchasK 改用+-
    • 表达式 L_SPLIT_DATE = ... 在 Oracle 中无效。必须使用标准列别名 NVL(...) AS L_SPLIT_DATE
    【解决方案2】:

    这是一个查询吗?我对 SQL Server 了解不多,但您可能需要一个 PL/SQL 块...

    无论如何,对于查询,SELECT 应该是这样的,注意别名 L_SPLIT_DATE(不是分配):

    SELECT (NVL(SPLIT_DATE, TO_DATE('20000101', 'YYYYMMDD')) + 1) L_SPLIT_DATE FROM OGEN.GEN_P_ARCHIVE
    

    对于 ROWCOUNT,您必须将计数作为独立查询执行,除非最后一条语句是更新或删除 DML,但抱歉,不适用于选择。

    这里的事情是你在那里的 IF,作为一个程序指令,你必须知道如何用 oracle 处理它,如果你不能在 PL/SQL 中做到这一点,你将不得不用 EXISTS 来解决验证或子查询,如果您向我们展示 IF 之后的内容将会很有帮助。

    对于 DATEDIFF,我引用 @Yahia 的 DATEADD。

    对于 DATEDIFF 和 DATEADD - 在 Oracle 中,您可以只使用 - 和 +,Oracle 将操作数分别解释为 DATE 和“天数”(可以是浮点数)。

    【讨论】:

      猜你喜欢
      • 2016-07-29
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 2018-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-01
      相关资源
      最近更新 更多