如何通过非键列查询并指定选取第N行的SQL语句?
解决方案
根据你使用的数据库类型,以下是获取第N行数据的SQL写法:
SQL Server(匹配你当前语句的语法)
方法1:适用于SQL Server 2012及以上版本
使用OFFSET/FETCH语法直接指定跳过的行数和目标行数:
SELECT * FROM [<dbname>].[dbo].[<tablename>] WHERE [<Column name I want to search>] = 'Search term' ORDER BY [<Key>] -- 必须指定排序字段,确保行顺序固定 OFFSET (@N - 1) ROWS FETCH NEXT 1 ROW ONLY;
将@N替换为你要获取的行号(比如取第2行就传2,语句会自动跳过前1行取目标行)。
方法2:适用于SQL Server 2008及以下版本
用ROW_NUMBER()函数给结果行编号,再筛选目标行:
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY [<Key>]) AS RowNum FROM [<dbname>].[dbo].[<tablename>] WHERE [<Column name I want to search>] = 'Search term' ) AS TempResult WHERE RowNum = @N;
MySQL
使用LIMIT子句指定偏移量和行数:
SELECT * FROM `<dbname>`.`<tablename>` WHERE `<Column name I want to search>` = 'Search term' ORDER BY `<Key>` LIMIT @N-1, 1;
第一个参数是偏移量(要获取第N行需跳过前N-1行),第二个参数表示只取1行。
PostgreSQL
通过OFFSET和LIMIT组合实现:
SELECT * FROM "<dbname>"."<tablename>" WHERE "<Column name I want to search>" = 'Search term' ORDER BY "<Key>" OFFSET @N-1 LIMIT 1;
关键注意事项
- 必须加
ORDER BY:不指定排序规则的话,数据库返回的行顺序可能随机变化,导致取到非预期行,建议用主键字段作为排序依据。 - 避免SQL注入:不要直接把
@N或搜索词拼接到SQL字符串中,优先用第三方软件支持的参数化方式传递变量。 - 校验行号范围:利用你已能获取的总行数,先判断N是否在1到总行数之间,避免执行无效查询。
内容的提问来源于stack exchange,提问作者Rispiny
相关产品推荐
相关产品推荐

