1

给定

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);

SELECT COUNT(*) FROM Foo WHERE mod(rownum,2) = 0;

返回 0 行,它应该返回 1

SELECT COUNT(*) FROM (SELECT mod(rownum,2) z FROM Foo) tt WHERE z=0;

返回 1 行

我在这里想念什么?我在ROWNUM或 MOD 文档中没有看到任何建议。

4

2 回答 2

9

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

您可以执行以下操作:

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

是该ROWNUM行在结果集中的位置,在选择记录后对其进行评估。

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

WHERE ROWNUM > x
WHERE ROWNUM BETWEEN x AND y

但这会起作用

WHERE ROWNUM < x

由于您想rownum使用该功能评估该mod功能,因此它将无法工作,因为此时该rownum功能不可用。这就是为什么您必须将其放在子查询中才能使用该mod功能。

于 2012-08-22T19:24:30.697 回答
2

ROWNUM 返回实际查询的行号,而不是查询所基于的表的行号。因此SELECT COUNT(*) ...返回行号为 1 的一行,mod(rownum,2) != 0然后被 WHERE 原因丢弃,实际上根本不返回任何行。

将行号作为列返回的(未过滤的)子选择会有所帮助。然后将 WHERE 子句应用于外部选择。

于 2012-08-22T19:24:32.110 回答