最近看到一个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分)
创建表数据:
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,’
方法一:
update [Contract] set buget=‘,’+buget whereleft(buget,1)=‘,’
update [Contract] set buget=buget+‘,’whereright(buget,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)
方法二:
update [Contract] set buget=‘,’+buget where charindex(‘,’,buget)<>1
update [Contract] set buget=buget+‘,’where charindex(‘,’,reverse(buget))<>1
说实话,我当时就这两种思路,这也是SQL中常见的基本用法。但出人意料的第三种方法出现了。
方法三:
UPDATE [contract] SET Buget = ‘,’+Buget+‘,’
UPDATE [contract] SET Buget = REPLACE(Buget,‘,,’,‘,’)
当然,此语句其实还是有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+‘,’
当然,也可以结合前面的思路稍作修正,这里就不再赘述,请读者自己思考。
感悟:释迦牟尼说过“人生需要经过六项修炼:布施、持戒、忍辱、精进、禅定、智慧。”,SQL编程,或C#、Java,甚至Javascrip的某个领域也是如此。技术是死的,思路是鲜活的,有时候,思路能轻易地突破技术很难实现的死角。到了一定程度时,会发现潜意识里已经被惯性思维塞满,而无法接受新鲜思维方式或思路,如果一段时间内持续如此,那么,我们应该警醒,把自己的头脑放空,把自己置于一个初学者的地位,重新开始“精进”的修炼!
原文链接:http://www.cnblogs.com/downmoon/archive/2011/03/02/1968615.html