日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
SQL server的一道入門面試題背后的思考

最近看到一個(gè)SQL Server的小例子,發(fā)現(xiàn)完全可以作為SQL server的一道入門面試題。題目如下:

創(chuàng)新互聯(lián)是一家專注于網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站與策劃設(shè)計(jì),老河口網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十載,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:老河口等地區(qū)。老河口做網(wǎng)站價(jià)格咨詢:18980820575

例:有一合同表Contract

buget

IdNameTotal
1合同名稱100 102,22
2合同名稱2300,102,22,
3合同名稱3200 103,23,

要求:用SQL語(yǔ)句更新表的buget字段,如果前后沒(méi)有","要加上","(即一個(gè)英文逗號(hào))。(10分)

創(chuàng)建表數(shù)據(jù):

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,'   

 分析:這道題乍看很簡(jiǎn)單,由于肯定用到Replace,所以很自然的結(jié)合left,right,從而得到以下語(yǔ)句

方法一

  
 
 
  1. update [Contract] set buget=','+buget where left(buget,1)=',' 
  2. update [Contract] set buget=buget+',' where right(buget,1)=','  

如果能寫成一個(gè) SQL語(yǔ)句,可以加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)  

如果能從字符串的開(kāi)關(guān)和結(jié)尾這個(gè)思路出發(fā),結(jié)合Reverse,可以提到如下方法:

方法二:

  
 
 
  1. update [Contract] set buget=','+buget where charindex(',',buget)<>1  
  2. update [Contract] set buget=buget+',' where charindex(',',reverse(buget))<>1  

該方法,主要涉及charindex函數(shù)和reverse函數(shù)。

說(shuō)實(shí)話,我當(dāng)時(shí)就這兩種思路,這也是SQL中常見(jiàn)的基本用法。但出人意料的第三種方法出現(xiàn)了。

方法三:

  
 
 
  1. UPDATE [contract] SET Buget = ','+Buget+',' 
  2. UPDATE [contract] SET Buget = REPLACE(Buget,',,',',')  

解析:該方法最主要的亮點(diǎn)不在于語(yǔ)法的精妙,而在于其思路的異于常規(guī)。先給兩邊補(bǔ)上逗號(hào),再替換雙逗號(hào)為單逗號(hào)。這在實(shí)際編程中確實(shí)難能可貴。換句話說(shuō),
如果沒(méi)有事先思考過(guò)的話,這反映了解題者反應(yīng)敏捷,思路開(kāi)放。因此,至少可以再加3分。

當(dāng)然,此語(yǔ)句其實(shí)還是有bug,比如如果原bug字段中間有兩個(gè)逗號(hào),那么在Replace時(shí)就會(huì)更新掉不應(yīng)該更新的內(nèi)容。不過(guò),稍加修正,限定replace的范圍即可,

受此思路啟發(fā),可以引申得到以下類似方法:

方法四:

  
 
 
  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+','  

該方法是先去掉兩邊的逗號(hào),再給每條記錄加上逗號(hào),比起方法三來(lái),稍顯繁瑣,這也反襯了方法三的巧妙。

當(dāng)然,也可以結(jié)合前面的思路稍作修正,這里就不再贅述,請(qǐng)讀者自己思考。

感悟:釋迦牟尼說(shuō)過(guò)“人生需要經(jīng)過(guò)六項(xiàng)修煉:布施、持戒、忍辱、精進(jìn)、禪定、智慧?!?,SQL編程,或C#、Java,甚至Javascrip的某個(gè)領(lǐng)域也是如此。技術(shù)是死的,思路是鮮活的,有時(shí)候,思路能輕易地突破技術(shù)很難實(shí)現(xiàn)的死角。到了一定程度時(shí),會(huì)發(fā)現(xiàn)潛意識(shí)里已經(jīng)被慣性思維塞滿,而無(wú)法接受新鮮思維方式或思路,如果一段時(shí)間內(nèi)持續(xù)如此,那么,我們應(yīng)該警醒,把自己的頭腦放空,把自己置于一個(gè)初學(xué)者的地位,重新開(kāi)始“精進(jìn)”的修煉!


分享題目:SQL server的一道入門面試題背后的思考
鏈接分享:http://www.5511xx.com/article/djoidgc.html