亿华智慧云亿华智慧云

SQL server的一道入门面试题背后的思考

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

例:有一合同表Contract

SQL server的一道入门面试题背后的思考

Id Name Total

buget

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

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

创建表数据:

View Code

复制use Testdb2     go     IF NOT OBJECT_ID([Contract]) ISNULL DROPTABLE [Contract]     GO      Createtable [Contract]      (ID intprimarykey identity(1,的道入的思1)    ,[Name] nvarchar(50) null ,Total floatnull ,buget Nvarchar(500) null )      go      insertinto [Contract]     select合同名称,  100,102,22 unionall select合同名称2, 300,,102,22, unionall select合同名称3, 300,101,23, 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.  分析:这道题乍看很简单,由于肯定用到Replace,门面所以很自然的试题结合left,right,从而得到以下语句

方法一

复制update [Contract] set buget=,+buget whereleft(buget,1)=, update [Contract] set buget=buget+,whereright(buget,1)=, 1.2. 如果能写成一个 SQL语句,可以加1分。背后 复制update [Contract]    set buget=(casewhen (left(buget,的道入的思1)!=,andright   (buget,1)!=,) then,+buget+, whenleft(buget,1)!=,then,+buget               whenright(buget,1)!=,then  buget+, else buget         end)   1.2.3.4.5.6. 如果能从字符串的开关和结尾这个思路出发,结合Reverse,门面可以提到如下方法:

方法二:

复制update [Contract] set buget=,试题+buget where charindex(,,buget)<>1   update [Contract] set buget=buget+,where charindex(,,reverse(buget))<>1   1.2. 该方法,主要涉及charindex函数和reverse函数。背后

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

方法三:

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

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

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

方法四:

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

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

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

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

赞(7)
未经允许不得转载:>亿华智慧云 » SQL server的一道入门面试题背后的思考