数据库函数与视图实战

16、创建一个名为 unaccent() 的函数,该函数从作为参数传入的文本中移除 à、é、è、ê、ö、ô、ü,并分别用 a、e、e、e、oe、o、ue 替换它们。

不同数据库创建该函数的代码如下:

SQL Server:

create function unaccent(@string varchar(max)) 
returns varchar(max) 
begin 
    return replace(replace(replace(replace(replace(replace(replace(@string, 'à', 'a'), 'é', 'e'), 'è', 'e'), 'ê', 'e'), 'ö', 'oe'), 'ô', 'o'), 'ü', 'ue'); 
end;

MySQL 和 DB2:

首先执行:

delimiter $$

然后执行:

create function unaccent(p_string varchar(1000)) 
returns varchar(1000) 
return replace(replace(replace(replace(replace(replace(replace(p_string, 'à', 'a'), 'é', 'e'), 'è', 'e'), 'ê', 'e'), 'ö', 'oe'), 'ô', 'o'), 'ü', 'ue');
  • 对于 MySQL ,接着输入 $$ ,再执行:
    sql delimiter ;

  • 对于 DB2 ,在 clpplus 中在行首输入 / 并回车。

PostgreSQL:

create function unaccent(p_string varchar) 
returns varchar as $$
begin 
    return replace(replace(replace(replace(replace(replace(replace(p_string, 'à', 'a'), 'é', 'e'), 'è', 'e'), 'ê', 'e'), 'ö', 'oe'), 'ô', 'o'), 'ü', 'ue'); 
end; 
$$ language plpgsql;

Oracle:

create function unaccent(p_string varchar2) 
return varchar2 as 
begin 
    return replace(replace(replace(replace(replace(replace(replace(p_string, 'à', 'a'), 'é', 'e'), 'è', 'e'), 'ê', 'e'), 'ö', 'oe'), 'ô', 'o'), 'ü', 'ue'); 
end; 
/

17、创建一个名为 age() 的函数,该函数接收出生年份和死亡年份作为输入,若此人在世则返回其当前年龄,若此人已去世则返回死亡时年龄并在前面加上 ‘+’。

函数返回的表达式如下:

case 
    when @death_year is null 
    then cast(extract(year from getdate()) - @birth_year as varchar)
    else '+' + cast(@death_year - @birth_year as varchar) 
end
  • 参数在 SQL Server 中应为 @death_year @birth_year
  • 获取当前日期的函数和传递给 cast() 函数的类型因数据库管理系统而异:
  • 在 SQL Server 中,字符串连接使用加号 +
  • 在 MySQL 中, || 应替换为对 concat() 函数的调用,且当前年份应使用 year(now())

18、一个网站为了进行统计分析,按小时统计访问次数,并将数据存储在如下创建的表中(根据你的数据库管理系统调整数据类型):创建表webstats(interval_start datetime, interval_unit char(1), page varchar(255), hits int)。interval_unit 为’H’表示小时,为’D’表示天;page 是被请求的网站页面;hits 统计在 interval_start 到 interval_start 加上 interval_unit 对应时间之间该页面被请求的次数。我们希望保留详细的近期信息,但要对每个页面聚合所有超过三个月的数据。编写一个每周运行的过程,用于聚合旧数据并清除过旧的详细信息。

以下是不同数据库管理系统(DBMS)的实现示例:

D

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值