SQL server的一道入門面試題背后的思考
最近看到一個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
- 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,'
方法一:
- update [Contract] set buget=','+buget where left(buget,1)=','
- update [Contract] set buget=buget+',' where right(buget,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)
方法二:
- update [Contract] set buget=','+buget where charindex(',',buget)<>1
- update [Contract] set buget=buget+',' where charindex(',',reverse(buget))<>1
說實話,我當(dāng)時就這兩種思路,這也是SQL中常見的基本用法。但出人意料的第三種方法出現(xiàn)了。
方法三:
- UPDATE [contract] SET Buget = ','+Buget+','
- UPDATE [contract] SET Buget = REPLACE(Buget,',,',',')
當(dāng)然,此語句其實還是有bug,比如如果原bug字段中間有兩個逗號,那么在Replace時就會更新掉不應(yīng)該更新的內(nèi)容。不過,稍加修正,限定replace的范圍即可,
受此思路啟發(fā),可以引申得到以下類似方法:
方法四:
- 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+','
當(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
【編輯推薦】
- 如何讓微軟認(rèn)識閏年的2月29日
- SQL Server存儲過程的命名標(biāo)準(zhǔn)如何進行?
- 卸載SQL Server 2005組件的正確順序
- 對SQL Server字符串?dāng)?shù)據(jù)類型的具體描述
- SQL Server數(shù)據(jù)類型的種類與應(yīng)用