SQL server的一道入门面试题背后的思考
创始人
2024-07-21 23:01:14
0

最近看到一个SQL Server的小例子,发现完全可以作为SQL server的一道入门面试题。题目如下:

例:有一合同表Contract

Id Name Total

buget

1 合同名称 100  102,22
2 合同名称2 300 ,102,22,
3 合同名称3 200  103,23,

要求:用SQL语句更新表的buget字段,如果前后没有","要加上","(即一个英文逗号)。(10分)

创建表数据:

View Code

  1. use Testdb2    
  2. go    
  3. IF NOT OBJECT_ID('[Contract]') IS NULL        
  4. DROP TABLE [Contract]    
  5. GO     
  6. Create table [Contract]     
  7. (ID int primary key identity(1,1)   
  8. ,[Name] nvarchar(50) null   
  9. ,Total float null   
  10. ,buget Nvarchar(500) null )     
  11. go     
  12. insert into [Contract]    
  13. select '合同名称',  100,'102,22'    
  14. union all    
  15. select '合同名称2', 300,',102,22,'    
  16. union all    
  17. select '合同名称3', 300,'101,23,'   
 分析:这道题乍看很简单,由于肯定用到Replace,所以很自然的结合left,right,从而得到以下语句

方法一

  1. update [Contract] set buget=','+buget where left(buget,1)=',' 
  2. update [Contract] set buget=buget+',' where right(buget,1)=','  
如果能写成一个 SQL语句,可以加1分。
  1. update [Contract]   
  2. set buget=(case when (left(buget,1)!=',' and right   (buget,1)!=',') then  ','+buget+','              
  3. when left(buget,1)!=',' then ','+buget              
  4. when right(buget,1)!=',' then  buget+','              
  5. else buget        
  6. end)  
如果能从字符串的开关和结尾这个思路出发,结合Reverse,可以提到如下方法:

方法二:

  1. update [Contract] set buget=','+buget where charindex(',',buget)<>1  
  2. update [Contract] set buget=buget+',' where charindex(',',reverse(buget))<>1  
该方法,主要涉及charindex函数和reverse函数。

说实话,我当时就这两种思路,这也是SQL中常见的基本用法。但出人意料的第三种方法出现了。

方法三:

  1. UPDATE [contract] SET Buget = ','+Buget+',' 
  2. UPDATE [contract] SET Buget = REPLACE(Buget,',,',',')  
解析:该方法最主要的亮点不在于语法的精妙,而在于其思路的异于常规。先给两边补上逗号,再替换双逗号为单逗号。这在实际编程中确实难能可贵。换句话说,如果没有事先思考过的话,这反映了解题者反应敏捷,思路开放。因此,至少可以再加3分。

当然,此语句其实还是有bug,比如如果原bug字段中间有两个逗号,那么在Replace时就会更新掉不应该更新的内容。不过,稍加修正,限定replace的范围即可,

受此思路启发,可以引申得到以下类似方法:

方法四:

  1. UPDATE [contract] SET Buget = substring(BuGet,2,len(BuGet)-1) wherecharindex(',',buget)=1  
  2. UPDATE [contract] SET Buget = substring(BuGet,1,len(BuGet)-1) wherecharindex(',',reverse(buget))=1  
  3. UPDATE [contract] SET BuGet = ','+BuGet+','  
该方法是先去掉两边的逗号,再给每条记录加上逗号,比起方法三来,稍显繁琐,这也反衬了方法三的巧妙。

当然,也可以结合前面的思路稍作修正,这里就不再赘述,请读者自己思考。

感悟:释迦牟尼说过“人生需要经过六项修炼:布施、持戒、忍辱、精进、禅定、智慧。”,SQL编程,或C#、Java,甚至Javascrip的某个领域也是如此。技术是死的,思路是鲜活的,有时候,思路能轻易地突破技术很难实现的死角到了一定程度时,会发现潜意识里已经被惯性思维塞满,而无法接受新鲜思维方式或思路,如果一段时间内持续如此,那么,我们应该警醒,把自己的头脑放空,把自己置于一个初学者的地位,重新开始“精进”的修炼!

原文链接:http://www.cnblogs.com/downmoon/archive/2011/03/02/1968615.html

【编辑推荐】

  1. 如何让微软认识闰年的2月29日
  2. SQL Server存储过程的命名标准如何进行?
  3. 卸载SQL Server 2005组件的正确顺序
  4. 对SQL Server字符串数据类型的具体描述
  5. SQL Server数据类型的种类与应用

 

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...