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

时间:2013-11-16 04:00:23

标签: sql oracle

我正在使用以下查询来检索偶数编号的记录。但是在reslut中它没有显示任何行

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

为什么mod(rownum,2)不适用于conditiom

请你也可以给查询选择奇数记录

该查询有什么问题吗?

建议请..

11 个答案:

答案 0 :(得分:10)

它无效,因为:第一行ROWNUM1,在这种情况下,MOD(ROWNUM,2)1,因为您的WHERE声明是MOD(ROWNUM,2)=0然后这会减少到1=0并且该行将被丢弃。然后将对ROWNUM的1进行后续行测试(因为前一行不再在输出中,并且不会有行号),这将再次使测试失败并被丢弃。重复,恶心和所有行都未通过WHERE测试并被丢弃。

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

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

WITH subquery AS (
  SELECT ename,job,ROWNUM AS row_id
  FROM   Emp
  ORDER BY ename
)
SELECT ename, job
FROM   subquery
WHERE  MOD( row_id, 2 ) = 0;

SQLFIDDLE

答案 1 :(得分: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

答案 2 :(得分:1)

尝试一下

要查找偶数行详细信息,可以使用此代码。 这个人在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 :(得分:0)

select * from emp where empid in (select decode(mod(rownum,2),0, empid,null) from emp);  --Alternate record Even numbered

从表格中获取偶数记录

答案 4 :(得分:0)

或者您可以试试这个:

此处内部查询将获取所有偶数记录主键值,并根据该值获取所有这些记录详细信息。

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

答案 5 :(得分:0)

这可以做到:

memory_order_relaxed

答案 6 :(得分:0)

使用以下查询u将获得结果:

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;

答案 7 :(得分:0)

使用以下查询,

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

答案 8 :(得分:0)

Select ename, job from emp where mod(id, 2) =0 ;

如果表具有标识列,则可以尝试id的{​​{1}}列int

答案 9 :(得分:-3)

请尝试:

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

答案 10 :(得分:-3)

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