设为首页 收藏本站
查看: 729|回复: 0

[经验分享] SQL server的一道入门面试题背后的思考

[复制链接]
累计签到:2 天
连续签到:1 天
发表于 2015-6-29 17:57:36 | 显示全部楼层 |阅读模式
  最近看到一个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分)
  创建表数据:


DSC0000.gif DSC0001.gif View Code



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




update [Contract] set buget=','+buget where left(buget,1)=','
update [Contract] set buget=buget+',' where right(buget,1)=','
  如果能写成一个 SQL语句,可以加1分。




update [Contract]
set buget=(case when (left(buget,1)!=',' and right(buget,1)!=',') then  ','+buget+','
            when left(buget,1)!=',' then ','+buget
            when right(buget,1)!=',' then  buget+','
            else buget
      end)
  如果能从字符串的开关和结尾这个思路出发,结合Reverse,可以提到如下方法:

  方法二:




update [Contract] set buget=','+buget where charindex(',',buget)1
update [Contract] set buget=buget+',' where charindex(',',reverse(buget))1
  该方法,主要涉及charindex函数和reverse函数。
  说实话,我当时就这两种思路,这也是SQL中常见的基本用法。但出人意料的第三种方法出现了。
  方法三:




UPDATE [contract] SET Buget = ','+Buget+','
UPDATE [contract] SET Buget = REPLACE(Buget,',,',',')
  解析:该方法最主要的亮点不在于语法的精妙,而在于其思路的异于常规。先给两边补上逗号,再替换双逗号为单逗号。这在实际编程中确实难能可贵。换句话说,如果没有事先思考过的话,这反映了解题者反应敏捷,思路开放。因此,至少可以再加3分。
  当然,此语句其实还是有bug,比如如果原bug字段中间有两个逗号,那么在Replace时就会更新掉不应该更新的内容。不过,稍加修正,限定replace的范围即可,
  受此思路启发,可以引申得到以下类似方法:
  方法四:




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

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

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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-81692-1-1.html 上篇帖子: SQL Server 2008中的代码安全(三):通过PassPhrase加密 下篇帖子: 《Expert Cube Development with Microsoft SQL Server 2008 Analysis Services》读书笔记第九
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表