1 不跟你多废话 上代码!

  1. /// <summary>
  2. /// SQL关键字转换器
  3. /// </summary>
  4. public class SqlConverter : IKeywordsConvertible
  5. {
  6. public SqlConverter(string[] keywords)
  7. {
  8. Keywords = keywords;
  9. }
  10. public SqlConverter() { }
  11.  
  12. /// <summary>
  13. /// 关键字集合
  14. /// </summary>
  15. public string[] Keywords
  16. {
  17. get { return keywords; }
  18. set
  19. {
  20. this.keywords = new string[value.Length];
  21. for (int i = ; i < value.Length; i++)
  22. {
  23. this.keywords[i] = value[i].ToLower();
  24. }
  25. }
  26. }
  27.  
  28. private string[] keywords;
  29.  
  30. /// <summary>
  31. /// 字符缓冲区
  32. /// </summary>
  33. private StringBuilder charBuilder = new StringBuilder();
  34.  
  35. /// <summary>
  36. /// 符号缓冲区
  37. /// </summary>
  38. private StringBuilder symboBuilder = new StringBuilder();
  39.  
  40. /// <summary>
  41. /// 结果缓冲区
  42. /// </summary>
  43. private StringBuilder resBuilder = new StringBuilder();
  44.  
  45. /// <summary>
  46. /// 上一个字符是否是字母
  47. /// </summary>
  48. private bool lastIsLetter;
  49.  
  50. /// <summary>
  51. /// 临时变量
  52. /// </summary>
  53. private string temp;
  54.  
  55. /// <summary>
  56. /// 转换
  57. /// </summary>
  58. /// <param name="source">要转换的字符串</param>
  59. /// <returns>转换结果</returns>
  60. public string Convert(string source)
  61. {
  62. charBuilder.Clear();
  63. symboBuilder.Clear();
  64. resBuilder.Clear();
  65. lastIsLetter = true;
  66. temp = string.Empty;
  67.  
  68. // 打散源字符串
  69. char[] charArray = source.ToArray<char>();
  70.  
  71. // 遍历
  72. foreach (var c in charArray)
  73. {
  74. if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
  75. {
  76. // 如果上一个符号不是字母,就把符号缓冲区推送
  77. if (!lastIsLetter)
  78. {
  79. PushSymbols();
  80. }
  81. charBuilder.Append(c);
  82. lastIsLetter = true;
  83. }
  84. else
  85. {
  86. // 如果上一个符号是字母,就把字母缓冲区推送
  87. if (lastIsLetter)
  88. {
  89. PushLetters();
  90. }
  91. symboBuilder.Append(c);
  92. lastIsLetter = false;
  93. }
  94. }
  95.  
  96. // 处理最后一个缓冲区
  97. if (lastIsLetter)
  98. {
  99. PushLetters();
  100. }
  101. else
  102. {
  103. PushSymbols();
  104. }
  105.  
  106. return resBuilder.ToString();
  107. }
  108.  
  109. /// <summary>
  110. /// 将字符缓冲区推送至目标缓冲区
  111. /// </summary>
  112. private void PushLetters()
  113. {
  114. temp = charBuilder.ToString();
  115. if (Keywords.Contains(temp.ToLower()))
  116. {
  117. resBuilder.Append(temp.ToUpper());
  118. }
  119. else
  120. {
  121. resBuilder.Append(temp);
  122. }
  123. charBuilder.Clear();
  124. }
  125.  
  126. /// <summary>
  127. /// 将符号缓冲区推送至目标缓冲区
  128. /// </summary>
  129. private void PushSymbols()
  130. {
  131. resBuilder.Append(symboBuilder.ToString());
  132. symboBuilder.Clear();
  133. }
  134. }

2 原理

  第一步 :将一个SQL语句字符串拆开来,拆成 字符串-符号串-字符串-符号串-符号串-字符串 这样

  第二步 :然后判断字符串是不是关键字,是的话就转成大写

  第三部 :再将这些串拼起来

3 实现

  原理看似很简单,但实现却不简单。

  要处理两个问题

    1 不可能全转换之后再处理拼接,所以必须边拼接边转换

    2 状态切换,什么时候推送

  实现步骤

    1 源串打碎成char数组

    2 拼接 重点是判断 如何确定 字母和符号状态,以及在状态切换至将缓冲区推送。详情看代码

    3 最后要再做一次,因为遍历之后最后一个串没有机会被推送

4 使用效果

  

5 后记

  最近公司修改了SQL规范,要求SQL关键字大写,诶,我写了那么多没上线,都要改。作为一个程序员,这肯定是可以用代码来干的啊。

  于是,我动手百度!对我没有自己写,我懒。

  百到了一个工具,为了安全起见,我反编译了工具,看了看代码。没危险。但是啊,看不懂,功能倒是实现了。

  于是我就先用着把我的SQL都改了。

  但是我觉得,我看不懂啊,没学到。我想自己去实现!

  于是随后的几天我开始思索如何来将SQL关键字变大写,又不会影响其他的部分,包括回车换行这些不可见符号(就是不能用不可见符号做分割,因为如果有相连的不可符号,切割之后会丢失)。

  在公司的年会上

  我终于想到了,看着我身旁的妹子们(我同事),诶亚,好激动。

  利用闲暇时间,写了这个,独立的思考没有参考我找的的工具的代码。

  核心算法发出来,一起学习与交流。

SQL关键字转换大写核心算法实现的更多相关文章

  1. sql关键字的解释执行顺序

      sql关键字的解释执行顺序 分类: 笔试面试总结2013-03-17 14:49 1622人阅读 评论(1) 收藏 举报 SQL关键字顺序 表里面的字段名什么符号都不加,值的话一律加上单引号 有一 ...

  2. SQL行列转换6种方法

    在进行报表开发时,很多时候会遇到行列转换操作,很对开发人员针对于SQL级别行列转换操作一直不甚理解,今天正好抽空对其进行了一些简单的总结.这里主要列举3种可以实现SQL行列转换的方法,包括通用SQL解 ...

  3. 完善SQL农历转换函数

    -------------------------------------------------------------------- --  Author : 原著:          改编:ht ...

  4. SQL 语句转换格式函数Cast、Convert 区别

    SQL 语句转换格式函数Cast.Convert CAST和CONVERT都经常被使用.特别提取出来作为一篇文章,方便查找. CAST.CONVERT都可以执行数据类型转换.在大部分情况下,两者执行同 ...

  5. SQL零星技术点:SQL中转换money类型数值转换为字符串问题

    --SQL中转换money类型数值转换为字符串问题,直接转换就转为两位了,所以需要做一下处理.具体请看下述sql实例. 1 create table #test(price money) insert ...

  6. hibernate sql查询转换成VO返回list

    hibernate sql查询转换成VO @Override public List<FenxiVo> getTuanDuiFenxiList(FenxiVo FenxiVo,Intege ...

  7. Elasticsearch 关键字与SQL关键字对比总结

    由于Elasticsearch和MongoDB/Redis/Memcache一样,是非关系型数据库.而平常使用的MySql,Oracle,SQLServer 等为关系型数据库,二者有着本质的区别,Es ...

  8. 用Java实现MVPtree——MVPtree核心算法代码的搭建

    项目需要,需要把MVPtree这种冷门的数据结构写入Java,然网上没有成形的Java实现,虽说C++看惯了不过对C++实现复杂结构也是看得蒙蔽,幸好客户给了个github上job什么的人用Java写 ...

  9. Mysql索引,有哪几种索引,什么时候该(不该)建索引;SQL怎么进行优化以及SQL关键字的执行顺序

    索引(Index)是帮助MySQL高效获取数据的数据结构.提取句子主干,就可以得到索引的本质:索引是数据结构. 1.按照索引列值的唯一性,索引可分为唯一索引和非唯一索引 非唯一索引:B树索引 crea ...

随机推荐

  1. Scratch2.0例—接苹果

    Scratch2.0例—接苹果 [教学目标] 1. 学习例子,能用和构造条件 ,并把此条件插入到 中:能理解和应用,当条件成立时,不执行积木内的脚本. 2. 对比和 两个积木:前者用于无条件的重复执行 ...

  2. ActiveMQ讯息传送机制以及ACK机制

    http://blog.csdn.net/lulongzhou_llz/article/details/42270113 ActiveMQ消息传送机制以及ACK机制详解 AcitveMQ是作为一种消息 ...

  3. JSP处理AJAX

    register.jsp: <script type="text/javascript"> var req; function validate() { var idF ...

  4. OC与Swift创建pod

    Cocoa pods 是iOS最常用的类库管理工具   OC的使用   删除源   sudo gem sources -r https://rubygems.org/ 添加源(使用淘宝的镜像,记住要用 ...

  5. java开发之提高java和mysql代码性能和质量

    0.if嵌套的层数最好不要超过3层 点击(此处)折叠或打开 import java.util.HashMap; import java.util.Map; public class Qiantao { ...

  6. Vue.js实例

    构造器 每个 Vue.js 应用都是通过构造函数 Vue 创建一个 Vue 的根实例 启动的: var vm = new Vue({ // 选项 })

  7. LPC1768外部中断与GPIO中断

    LPC1768的外部中断严格来说只有四个,分别是EINT0,EINT1,EINT2,EINT3,技术手册上有如下说明 控制这四个外部中断靠以下寄存器 这三个寄存器的0 1 2 3位分别代表中断的0 1 ...

  8. STM8时钟系统详解

    就我个人看来,研究一块单片机,分为新手和老手两种模式,新人迫切的想先用,你得告诉他们怎么样最快的写出一个能跑起来的程序,告诉他们每一个外设的使用方式,老手不同,用的单片机多了外设对于他们而言没太多好奇 ...

  9. cocos2d-x 定时器selector的使用 :schedule的使用

    在游戏设计时,我们需要不断的改变屏幕显示来反映游戏操作的效果,最简单的就是提示用户已经进行的游戏时间.为此,我们需要使用cocos2d-x内置的任务调度机制,即CCNode的schedule成员函数. ...

  10. PHP上传文件大小的修改

    采用了plupload来上传文件,但是一直失败. 设置了插件的参数和接受的参数,仍旧失败. 此时想到php.ini中需要修改 post_max_sizeupload_file_size 然后重启服务器