SQL编程思想:基于5种主流数据库代码实现
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人


3.1.6 案例分析

接下来,我们通过两个案例分析进一步理解SQL函数的使用。

1.公司年会抽奖

很多公司都会在年终大会上提供抽奖环节。假如现在我们需要设计一个抽奖程序,每次从员工表中随机抽取一名中奖员工,如何通过SQL语句实现?方法就是,利用随机数函数为员工表中的每行数据指定一个随机顺序,然后排序并返回第1条记录。我们以MySQL为例:

我们每次执行以上查询,都会返回不同的员工,例如:

这种方法可能会导致同一个员工中奖多次,简单的处理方式就是再执行一次查询。

提示:另一种方式就是创建一个中奖员工表,每次抽奖后将中奖员工编号插入该表,下次抽奖时通过NOT IN子查询排除已经中奖的员工。我们将会在第7章中介绍子查询。

其他数据库的实现与MySQL类似,我们只需替换相应的随机数函数和限制返回数据的LIMIT子句。不过在Microsoft SQL Server中我们不能直接使用RAND函数,因为该函数在一次查询中返回的随机数都相同。我们可以利用NEWID函数返回一个随机的GUID作为排序的标准,例如:

这种方法本质上仍然利用了随机数。

2.保护个人隐私

姓名、身份证号以及银行卡号等属于个人敏感信息。为了保护个人隐私,我们在前端界面显示时可能需要将这些信息中的部分内容进行隐藏,也就是显示为星号(*)。以医院排队叫号系统为例,屏幕上通常会隐藏患者的姓氏(对于两个字的姓名)或者名字中的倒数第2个字(对于三个或更多字的姓名),例如“*三”或者“李*亮”。

我们首先来看如何在MySQL和PostgreSQL中实现这个功能:

其中,LEFT函数返回了姓名中倒数第2个字之前的内容,CHAR_LENGTH函数返回了姓名中的字符个数,星号(*)替代了姓名中的倒数第2个字,RIGHT函数返回了姓名中的最后1个字,CONCAT函数将所有内容连接成一个字符串。查询返回的结果如下:

其他数据库中的实现与此类似,例如:

Oracle和SQLite利用SUBSTR函数返回姓名中的部分内容,并且使用连接运算符(||)替代CONCAT函数。Microsoft SQL Server使用LEN函数返回姓名中的字符个数。