从表中仅选择奇数行或偶数行听起来像是你永远不必做的事情,除非你自行这样做。在谷歌快速搜索一下,可以证实这事情是经常有人会做的,但是,很少有数据库从业者知道如何做,他们总是在线数据库社区求助寻找答案。作为本文的读者,你可以省去在数据库论坛中寻找解决方案的麻烦,因为我们今天将在这里直接说明如何能做到。
选择合适的目标列
在我们谈论“偶数行或奇数行”之前,我们必须按我们要拆分数据的列对行进行排序。理想情况下,它的数据应该是数字、而且是唯一的并按升序排序。因此,像主键这样的自增列是完美的选项。否则,你可能需要使用 ORDER BY 子句编写子查询,然后从中进行选择。
例如,让我们在 Navicat Premium 16 的表设计器中打开 classicmodels 示例数据库的 orders 表。我们可以看到它的 PK(orderNumber 列)不是自动递增的,未选中的“自动递增”复选框就是证明:
但是,以网格视图打开表会显示 orderNumber 值按升序排列:
因此,我们可以直接针对表编写查询。
数据库解决方案
查找具有奇数或偶数值的记录的最简单方法是将列值除以 2 并检查余数。余数 0 表示偶数,而余数是奇数则表示奇数。但是,就像许多数据库任务一样,如何计算余数取决于你使用的数据库类型。
在 PostgreSQL、MySQL 和 Oracle 中,我们可以使用 MOD() 函数来检查余数:
以下是查找指定列具有偶数值的行的一般查询语法:
SELECT * FROM table_name WHERE mod(column_name,2) = 0;
此语法将查找目标列具有奇数值的行:
SELECT * FROM table_name WHERE mod(column_name,2) <> 0;
SQL Server 没有 MOD 函数。反而,它提供了 % 取模运算符。
以下是查找指定列具有偶数值的行的一般查询语法:
SELECT * FROM table_name where column_name % 2 = 0;
This syntax will find rows where our target column has odd values:
SELECT * FROM table_name where column_name % 2 <> 0;
一些例子
让我们首先在 SQL 中,然后在 SQL Server 中,针对 classicmodels 示例数据库的 orders 表尝试运行上述每个语句。
首先,我们将检索偶数行:
接下来,我们将只获取奇数行:
如前所述,SQL Server 没有 MOD 函数,因此最好使用 % 取模运算符。
偶数行:
奇数行:
总结
本文提供了一种从各种数据库中检索奇数或偶数行的简单方法,方法是检查目标列值除以 2 后的余数,既简单又有效。