自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

SQL server的一道入門面試題背后的思考

數(shù)據(jù)庫 SQL Server
SQL編程,或C#、Java,甚至Javascrip的某個領(lǐng)域也是如此。技術(shù)是死的,思路是鮮活的,有時候,思路能輕易地突破技術(shù)很難實現(xiàn)的死角。

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

例:有一合同表Contract

Id Name Total

buget

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

要求:用SQL語句更新表的buget字段,如果前后沒有","要加上","(即一個英文逗號)。(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,'   
 分析:這道題乍看很簡單,由于肯定用到Replace,所以很自然的結(jié)合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)  
如果能從字符串的開關(guān)和結(jié)尾這個思路出發(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ù)。

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

方法三:

  1. UPDATE [contract] SET Buget = ','+Buget+',' 
  2. UPDATE [contract] SET Buget = REPLACE(Buget,',,',',')  
解析:該方法最主要的亮點不在于語法的精妙,而在于其思路的異于常規(guī)。先給兩邊補上逗號,再替換雙逗號為單逗號。這在實際編程中確實難能可貴。換句話說,如果沒有事先思考過的話,這反映了解題者反應(yīng)敏捷,思路開放。因此,至少可以再加3分。

當(dāng)然,此語句其實還是有bug,比如如果原bug字段中間有兩個逗號,那么在Replace時就會更新掉不應(yīng)該更新的內(nèi)容。不過,稍加修正,限定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+','  
該方法是先去掉兩邊的逗號,再給每條記錄加上逗號,比起方法三來,稍顯繁瑣,這也反襯了方法三的巧妙。

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

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

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

【編輯推薦】

  1. 如何讓微軟認(rèn)識閏年的2月29日
  2. SQL Server存儲過程的命名標(biāo)準(zhǔn)如何進行?
  3. 卸載SQL Server 2005組件的正確順序
  4. 對SQL Server字符串?dāng)?shù)據(jù)類型的具體描述
  5. SQL Server數(shù)據(jù)類型的種類與應(yīng)用

 

責(zé)任編輯:艾婧 來源: 博客園
相關(guān)推薦

2017-03-10 09:33:16

JavaScript類型

2024-10-11 17:09:27

2018-03-06 15:30:47

Java面試題

2011-05-23 11:27:32

面試題面試java

2023-02-04 18:24:10

SeataJava業(yè)務(wù)

2009-08-11 10:12:07

C#算法

2009-08-11 14:59:57

一道面試題C#算法

2009-08-11 15:09:44

一道面試題C#算法

2017-11-21 12:15:27

數(shù)據(jù)庫面試題SQL

2022-04-08 07:52:17

CSS面試題HTML

2021-05-31 07:55:44

smartRepeatJavaScript函數(shù)

2021-10-28 11:40:58

回文鏈表面試題數(shù)據(jù)結(jié)構(gòu)

2023-08-01 08:10:46

內(nèi)存緩存

2015-09-02 14:09:19

面試題程序設(shè)計

2021-03-16 05:44:26

JVM面試題運行時數(shù)據(jù)

2017-09-13 07:15:10

Python讀寫文件函數(shù)

2021-03-27 10:59:45

JavaScript開發(fā)代碼

2022-02-08 18:09:20

JS引擎解析器

2011-06-14 09:12:03

JavaScript

2021-04-13 08:50:21

JS作用域面試題
點贊
收藏

51CTO技術(shù)棧公眾號