我们公司主要mysql存储数据,因此也封装了比较好用mysql通用方法,然后,我们做大量接口,在处理分页查询接口,没有很好分查询方法。sql查询 语句如何解析成“分页查询”和“总统计”两条语句。可能,很多人在处理“总统计”是这样:“select count(*) from (<sql原查询语句>) ”,而不是把原sql查询语句中columns替换成“count(*)”;相比前者统计查询效率高不高,大家心知肚明。“分页查询”很简单,对于mysql语句就是在原sql查询语句后面加上“limit 数字 offset 数字”

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks; namespace MySqlTest
{
class Program
{
static void Main(string[] args)
{
string sql = "select id,code,name,modifytime,storeid from retail_cashier where profileid=@profileid and storeId=@storeId order by id";
var parts = MysqlPageHelper.BuildPageQuery(sql, , ); Console.WriteLine("sql:{0};",parts.Sql);
Console.WriteLine("SqlCount:{0}", parts.SqlCount);
Console.WriteLine("SqlPage:{0}",parts.SqlPage);
Console.WriteLine("SqlOrderBy:{0}", parts.SqlOrderBy);
Console.ReadKey();
}
} public class MysqlPageHelper
{
public Regex RegexColumns = new Regex(@"\A\s*SELECT\s+((?:\((?>\((?<depth>)|\)(?<-depth>)|.?)*(?(depth)(?!))\)|.)*?)(?<!,\s+)\bFROM\b",
RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Singleline | RegexOptions.Compiled); public Regex RegexDistinct = new Regex(@"\ADISTINCT\s",
RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Singleline | RegexOptions.Compiled); public Regex RegexOrderBy =
new Regex(
@"\bORDER\s+BY\s+(?!.*?(?:\)|\s+)AS\s)(?:\((?>\((?<depth>)|\)(?<-depth>)|.?)*(?(depth)(?!))\)|[\[\]`""\w\(\)\.])+(?:\s+(?:ASC|DESC))?(?:\s*,\s*(?:\((?>\((?<depth>)|\)(?<-depth>)|.?)*(?(depth)(?!))\)|[\[\]`""\w\(\)\.])+(?:\s+(?:ASC|DESC))?)*",
RegexOptions.RightToLeft | RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Singleline | RegexOptions.Compiled); private string _sqlSelectRemoved = null;
public void SplitSql(string sql, long skip, long take)
{
this.Sql = sql;
this.SqlCount = null;
this.SqlOrderBy = null; // 从中提取列
var m = RegexColumns.Match(this.Sql);
if (!m.Success)
throw new Exception("无法解析分页查询的SQL语句"); // sql语句中columns替换成count(*)
var g = m.Groups[];
this._sqlSelectRemoved = this.Sql.Substring(g.Index); if (RegexDistinct.IsMatch(this._sqlSelectRemoved))
this.SqlCount = this.Sql.Substring(, g.Index) + "COUNT(" + m.Groups[].ToString().Trim() + ") " + sql.Substring(g.Index + g.Length);
else
this.SqlCount = this.Sql.Substring(, g.Index) + "COUNT(*) " + sql.Substring(g.Index + g.Length); // sql语句最后order by
m = RegexOrderBy.Match(this.SqlCount);
if (m.Success)
{
g = m.Groups[];
this.SqlOrderBy = g.ToString();
this.SqlCount = this.SqlCount.Substring(, g.Index) + this.SqlCount.Substring(g.Index + g.Length);
}
//分页读取数据
SqlPage = string.Format("{0}\nLIMIT {1} OFFSET {2}", this.Sql, take, skip);
} public static MysqlPageHelper BuildPageQuery(string sql, long skip, long take)
{
var page=new MysqlPageHelper();
page.SplitSql(sql,skip,take);
return page;
} public string Sql { get; private set; }
public string SqlPage { get;private set; }
public string SqlCount { get;private set; }
public string SqlOrderBy { get;private set; }
}
}

sql查询语句如何解析成分页查询?的更多相关文章

  1. MySQL 查询语句--------------进阶8:分页查询

    #进阶8:分页查询 /* 应用场景:要显示的数据,一页显示不全,需要分页提交sql请求 语法: select 查询列表 from 表 [join type] join 表2 on 连接条件 [wher ...

  2. ASPNETCOREAPI 跨域处理 SQL 语句拼接 多条件分页查询 ASPNET CORE 核心 通过依赖注入(注入服务)

    ASPNETCOREAPI 跨域处理 AspNetCoreApi 跨域处理 如果咱们有处理过MV5 跨域问题这个问题也不大. (1)为什么会出现跨域问题:  浏览器安全限制了前端脚本跨站点的访问资源, ...

  3. SQL语句(六)分页查询和联合查询

    目录 一.分页查询 语法格式 应用 二.联合查询 语法和作用 特点 应用 UNION和UNION ALL的区别 一.分页查询 语法格式 SELECT 查询列表 FROM 表 WHERE ... GRO ...

  4. Sql 语句拼接 多条件分页查询

    Create PROCEDURE [dbo].[Proc_B2B_GetBatchMainPaging] @StationNo AS varchar() , --m @StationName AS v ...

  5. T-SQL查询语句(三):多表查询

    SQL查询语句<三>:多表查询 (也叫连接查询,此处为基于两个表的连接查询)如果一个查询需要对多个表进行操作就称为连接查询,连接查询的结果集或结果称为表之间的连接.连接查询实际上是通过各个 ...

  6. MySQL 数据库 查询语句的基本操作,单表查询,多表查询

    1.查询语句的基本操作 - select - from - where - group by - having - distinct - order by - limit - 聚合函数: count, ...

  7. QBC查询、离线条件查询(DetachedCriteric)和分页查询模版

    一.QBC检索步骤 QBC检索步骤: 1.调用Session的createCriteria()方法创建一个Criteria对象. 2.设定查询条件.Expression类提供了一系列用于设定查询条件的 ...

  8. mysql查询语句 和 多表关联查询 以及 子查询

    原文地址: http://blog.csdn.net/github_37767025/article/details/67636061 1.查询一张表: select * from 表名: 2.查询指 ...

  9. 【MySQL】条件查询之排序聚合分组分页查询

    排序查询 语法:order by 子句 order by 排序字段1 排序方式1 , 排序字段2 排序方式2... 排序方式: ASC:升序,默认的. DESC:降序. 注意: 如果有多个排序条件,则 ...

随机推荐

  1. Qt之qInstallMessageHandler(重定向至文件)

    简述 在Qt之qInstallMessageHandler(输出详细日志)一节中,我们讲解了如何使用自定义消息处理程序输出调试信息,而且可以很直观.很方便的得到输出代码所在的文件.函数.行号等信息. ...

  2. LAMP简易安装

    看,老鸟绕道–LAMP简易安装 导读 LAMP是企业中最常用的服务,也是非常稳定的网站架构平台.其中L-指的是Linux,A-指的是Apache,m-指的是mysql或者marriDB,p-php.相 ...

  3. JSP-JSTL学习

    <%@page import="com.Student"%> <%@page import="com.Person"%> <%@p ...

  4. 发一则自己创作的Lae程序员小漫画,仅供一乐

  5. 2. Transcribing DNA into RNA

    Problem An RNA string is a string formed from the alphabet containing 'A', 'C', 'G', and 'U'. Given ...

  6. CSS中的display属性

    CSS中的display属性 display:block是可以把非块级元素强制转换为块级元素显示,如内嵌元素span,原来不支持设置宽高,宽度是由内容撑开的,几个span元素是在同一行内的,如果给sp ...

  7. SVM

    sDJgfklJGV;LAKi管理科JF看了UFO李开复LKFLKJF EDJFO很疯狂的复活卡划分KJF

  8. Linux上搭建Elasticsearch服务器并同步数据库

    1.准备工作         下载Elasticsearch版本号2.3.4 https://www.elastic.co/downloads/past-releases/elasticsearch- ...

  9. SQL Server系统存储过程

    1. execute sp_databases   查询当前所有数据库大致信息(名称,大小等) 2. exec sp_helpdb [Myschool] 返回数据库的所有详细信息(数据库大小,位置,文 ...

  10. 原生select默认显示为空胡fish覅神农大丰今年圣诞节奋笔疾书发撒可交付你说的尽快发那段时间南方大厦尽可能放你的所发生的你富家大室耐腐蚀的看法呢尽快发你上课积啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊撒啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊分你束带结发你看

    下拉框默认为空: <select> <option value="" class="blank"></option> < ...