oracle如何从表中选择偶数记录?

Posted

技术标签:

【中文标题】oracle如何从表中选择偶数记录?【英文标题】:how to select even records from a table in oracle? 【发布时间】:2013-11-16 04:00:23 【问题描述】:

我正在使用下面的查询来检索偶数记录。但结果是它没有显示任何行

select ename,job from emp where mod(rownum,2)=0;

为什么 mod(rownum,2) 在 where 条件下不起作用

能否请您也提供查询以选择奇数记录

这个查询有什么问题吗?

请给点建议..

【问题讨论】:

【参考方案1】:

它不起作用,因为:对于第一行 ROWNUM1 并且在这种情况下,MOD(ROWNUM,2)1 并且由于您的 WHERE 语句是 MOD(ROWNUM,2)=0 然后这减少到 @987654328 @ 并且该行被丢弃。随后的行将针对 1 的ROWNUM 进行测试(因为前一行不再在输出中并且没有行号),这将再次失败并被丢弃。重复,令人作呕,所有行均未通过WHERE 测试并被丢弃。

如果您尝试使用 WHERE MOD(ROWNUM,2)=1 以这种方式获取奇数行,那么它将仅返回第一行,第二行以及随后的行将无法通过测试,并且永远不会包含在查询中。

正如 Vijaykumar Hadalgi 建议的那样,您需要在子查询中选择 ROWNUM(它可以在没有 where 子句限制的情况下对所有行进行编号),然后在外部查询中执行测试以限制行:

SELECT ename, job
FROM   (
  SELECT ename,
         job,
         ROWNUM AS row_id             -- Generate ROWNUM second.
  FROM   (
    SELECT ename, job
    FROM   Emp
    ORDER BY ename                    -- ORDER BY first.
  )
)
WHERE  MOD( row_id, 2 ) = 0;          -- Filter third.

SQLFIDDLE

【讨论】:

【参考方案2】:

试试这个

要查找 EVEN 行详细信息数,您可以使用此代码。 这个对 oracle SQL 和 mysql 都很熟悉。

select * from (select ename,job, ROWNUM AS rn from emp) where mod(rn, 2) = 0;

要查找 ODD 行详细信息数,您可以使用此代码。

select * from (select ename,job, ROWNUM AS rn from emp) where mod(rn, 2) <> 0;

【讨论】:

【参考方案3】:
-- for selecting rows 1,3,5,7....
SELECT EMPLOYEE_ID,FIRST_NAME, LAST_NAME FROM 
(
  SELECT DENSE_RANK OVER(ORDER BY EMPLOYEE_ID)AS RANK, EMPLOYEE_ID, FIRST_NAME, LAST_NAME
  FROM EMPLOYEES
)
WHERE MOD(RANK,2)=1

-- for selecting rows 2,4,6,8....
SELECT EMPLOYEE_ID,FIRST_NAME, LAST_NAME FROM 
(
  SELECT DENSE_RANK OVER(ORDER BY EMPLOYEE_ID)AS RANK, EMPLOYEE_ID, FIRST_NAME, LAST_NAME
  FROM EMPLOYEES
)
WHERE MOD(RANK,2)=0

【讨论】:

【参考方案4】:
select * from emp where empid in (select decode(mod(rownum,2),0, empid,null) from emp);  --Alternate record Even numbered

从表中获取偶数记录

【讨论】:

上面的代码是正确的,首先你执行查询@Sai【参考方案5】:

或者你可以试试这个:

这里内部查询将获取所有偶数记录的主键值,并基于此我们可以获取所有这些记录的详细信息。

SELECT * FROM EMP WHERE EMPNO IN
( 
SELECT CASE MOD(ROWNUM,2)
        WHEN 0 THEN EMPNO
        END
FROM EMP
);

这将获取所有奇数记录

SELECT * FROM EMP WHERE EMPNO IN
(
SELECT  CASE MOD(ROWNUM,2)
        WHEN 1 THEN EMPNO
        END
FROM EMP
);

【讨论】:

【参考方案6】:

这样就可以了:

Select * from (Select rownum as No_of_Row, E.* from emp E)
Where mod(No_of_Row,2)=0;

【讨论】:

【参考方案7】:

使用下面的查询你会得到结果:

SELECT empno,ename,slno  
FROM  ( SELECT empno,ename,ROW_NUMBER() OVER
(ORDER BY empno desc) AS slno FROM emp ) result WHERE mod(slno,2) = 1;

【讨论】:

【参考方案8】:

使用下面的查询,

select * from (select ename,job, ROWNUM as row_id from emp) where mod(row_id, 2) = 0;

【讨论】:

【参考方案9】:
Select ename, job from emp where mod(id, 2) =0 ;

如果表有标识列,您可以尝试使用 id 列而不是 rownum

【讨论】:

【参考方案10】:

row num 表示结果表中的行号,而不是原始表中的行号。 因此,首先将其分配给 row_id 或任何变量并使用该变量。

【讨论】:

【参考方案11】:

请尝试:

select * from emp where (rowid,0) in (select rowid, mod(rownum,2) from emp)

输出:- 2 4 6

Select * from emp where (rowid,1) in (select rowid, mod(rownum,2) from emp);

输出:1,3,5..

否则这会起作用

这个:

奇怪:

select * from
( 
SELECT col1, col2, ROW_NUMBER() OVER(ORDER BY col1 DESC) AS 'RowNumber', 
FROM table1
 ) d 
where (RowNumber % 2) = 1 

甚至:

select * from
( 
SELECT col1, col2, ROW_NUMBER() OVER(ORDER BY col1 DESC) AS 'RowNumber', 
FROM table1
) d 
where (RowNumber % 2) = 0

【讨论】:

查询工作..但是为什么 mod(rownum,2) 在 where 条件下不起作用 @TeamDataViz。前两个查询不起作用!

以上是关于oracle如何从表中选择偶数记录?的主要内容,如果未能解决你的问题,请参考以下文章

通过只知道没有时间的日期从表中选择 (ORACLE)

Rownum 或 Fetch/offset 适合选择和处理数百万条记录

如何在Oracle中添加一个策略,用户可以从表中选择所有数据,并且只能插入、更新、删除有条件的数据

如何从表中选择带有 oracle sql 中的 group by 子句的嵌套 json 对象?

仅从表中选择最新记录并使其快速,如何?

如何从表中选择记录并插入另一个表?