当前位置: 首页 > 知识库问答 >
问题:

将rownum()从db2转换为Oracle

汝志
2023-03-14

很好的一天,

我想更改一些程序代码(主要是SQL代码),因为数据库已经从DB2更改为Oracle。

这里有一个例子,我成功地改变了,但我不是真的了解它,我无法从谷歌找到它。

以下是原始SQL查询代码(使用DB2):

SELECT * 
FROM (SELECT T0.CREATEDBY AS C1, row_number() OVER ( ORDER BY T0.GROUPNAME) AS rownum 
FROM IBSADMIN.CCGROUP T0 
WHERE T0.GROUPID != 0001 AND T0.GROUPID != 001 AND T0.CHANNEL = 'CC') AS tname
WHERE rownum BETWEEN 1 AND 20

以下是我编辑后的SQL查询代码(成功从Oracle获取数据):

SELECT * 
FROM (SELECT T0.CREATEDBY AS C1, row_number() OVER ( ORDER BY T0.GROUPNAME) AS rownum1 
FROM IBSADMIN.CCGROUP T0 
WHERE T0.GROUPID != 0001 AND T0.GROUPID != 001 AND T0.CHANNEL = 'CC') tname
WHERE rownum1 BETWEEN 1 AND 20

当我分析时,如果我没有将rownum更改为rownum1,我会得到错误,错误是ORA-00923:FROM关键字未在预期位置找到。因此,我将其改为rownum1,我认为rownum应该是DB2中的一个关键字,Oracle也有这样的关键字吗?

在DB2代码的第4行最后一部分中,它以tname结尾。如果在Oracle代码中输入相同的内容,则会出现错误ORA-00933:SQL命令未正确结束。因此,我将擦除为。我不太明白tname的意思是什么,因为括号中的SQL查询:

(SELECT T0.CREATEDBY AS C1, row_number() OVER ( ORDER BY T0.GROUPNAME) AS rownum1 
    FROM IBSADMIN.CCGROUP T0 
    WHERE T0.GROUPID != 0001 AND T0.GROUPID != 001 AND T0.CHANNEL = 'CC')

它返回我2列,因此我不明白As tname如何与2列交互。

敬请告知。

共有2个答案

储俊英
2023-03-14

可能没有人对此感兴趣,但我在这里找到了这个解决方案:

http://www.sqlines.com/db2-to-oracle/fetch_first_rows_only

使用“仅获取前x行”,类似于:

select * from a_table  FETCH FIRST 1 ROWS ONLY;

只会给你表格的第一行,我用过这个,它就像我预期的那样工作。

郝池暝
2023-03-14

>

  • rowna是Oracle--在Oracle中,rowna是一个伪列,您可以引用它来获取结果集的行号(在排序之前)。这就是为什么转换为Oracle时需要更改别名的原因。我更喜欢与rowna更明显不同的东西--rnrnk是不错的选择。

    tname是查询中内联视图的别名。在Oracle中,您不能使用AS关键字来分配表别名(您可以在定义列别名时选择使用它,这就是为什么AS rownum1有效,但您也可以完全摆脱AS)。在这种情况下,tname别名永远不会使用,因此在Oracle中您可以省略它。我知道在某些数据库(SQLServer)中,内联视图需要别名——我不确定DB2是否需要表别名。

    听起来您正确地修改了查询(尽管我对您选择的别名而不是rownum提出了质疑)。

  •  类似资料:
    • 在我们的应用程序中,数据库将从SQL Server更改为DB2。

    • 问题内容: 关于从到的数据复制,我有以下问题: 上,我有一张表格,其中包含(为简单起见)两列:和。 被定义为。定义为。 通过将字符串转换为十六进制数,例如,从SQL被复制到或以通过使用以下SQL查询: 会在哪儿。 换句话说,COL1包含十六进制值,但为字符串(抱歉,如果措词不正确)。 我需要将十六进制值转换回字符串并将此值放入。 SQL查询应该执行什么转换?我知道该怎么做,但不知道如何做。 注意:

    • 好吧,我把它修好了。 我想将字符串“10-feb-201911:20”转换为“dd-mm-yyyy hh24:mi:ss”。 我试着约会但没用。我在其他线程上看到翻译功能可能是可行的。然而,我对SQL有点陌生,没有一个关于如何使用这种方式的解释可以翻译到我能够理解的地方。 当(长度(列)=50then to_date(substr(列,1,17),'dd-mm-yyyy hh24:mi')) 否则

    • 问题内容: 我有一个要求,我要获取两个ISO 8601时间戳格式的字符串,并且必须对其进行比较并获取它们的最大时间戳。字符串采用以下格式。 为了进行比较,我需要将它们转换为DB2时间戳,然后进行比较。问题出在“ T”和“ Z”字母上。因此,我无法施展。我知道我可以简单地 将T和Z进行转换,但是我想知道是否有更好的方法。 我尝试了以下功能,但无法获得所需的结果。 使用DB2 LUW v9.7 问题答

    • 问题内容: 好的,所以我试图用“,”分割字符串,它们不在’[‘或’]’内部。我有一个适用于JavaScript的RegEx,但无法将其转换为Java语法。 JS RegEX: 例句: 它在http://refiddle.com上运行良好,但是当我尝试在Java中(在Eclipse下)使用RegEx时,出现错误消息: 索引10附近的未封闭字符类,(?![^ [] *]) 我所做的就是删除开头的“ /

    • 线程“main”java.lang.nosuchmethoderror中出现异常:com.fasterxml.jackson.core.jsonFactory.createparser(ljava/net/URL;)lcom/fasterxml/jackson/core/jsonParser;在com.fasterxml.jackson.databind.objectmapper.readtree