使用mod函数的Oracle rownum行为

dfb*_*dfb 1 sql oracle

特定

CREATE TABLE Foo(v1 integer, v2 integer);

INSERT INTO Foo VALUES (1,2);
INSERT INTO Foo VALUES (3,4);
INSERT INTO Foo VALUES (5,6);
Run Code Online (Sandbox Code Playgroud)

SELECT COUNT(*) FROM Foo WHERE mod(rownum,2) = 0;
Run Code Online (Sandbox Code Playgroud)

返回0行,它应返回1

SELECT COUNT(*) FROM (SELECT mod(rownum,2) z FROM Foo) tt WHERE z=0;
Run Code Online (Sandbox Code Playgroud)

返回1行

我在这里错过了什么?我没有在ROWNUM或MOD文档中看到任何暗示任何想法的内容.

Tar*_*ryn 8

ROWNUM在您查询之前不会分配,因此您将无法在WHERE类似的子句中使用它.

您可以执行以下操作:

SELECT COUNT(*) 
FROM
(
  select v1, v2, rownum rn
  from Foo 
) f
WHERE mod(rn,2) = 0;
Run Code Online (Sandbox Code Playgroud)

ROWNUM是该行的位置INS的结果集,并选择了记录后进行评估.

这些类型的查询永远不会起作用:

WHERE ROWNUM > x
WHERE ROWNUM BETWEEN x AND y
Run Code Online (Sandbox Code Playgroud)

但这会奏效

WHERE ROWNUM < x
Run Code Online (Sandbox Code Playgroud)

由于您想要rownum使用该mod功能进行评估,因此无法使用该功能,因为此时rownum无法使用.这就是为什么,您必须将它放在子查询中才能使用该mod函数.