19.6.1 姓名问题处理

这是在做一个客户管理系统时遇到的问题。为照顾到一些国外客户,在设计客户名称列时使用了3列,分别用来存储名字(FirstName)、中间名(MiddleName)和姓氏(Last Name)。将姓氏和名字分别存储在业务处理上能够更加灵活,例如,在给客户发送电子邮件时可以只获取名字,像Dear John这样称呼会使客户感觉更加亲切,而在给客户邮寄东西时,则使用姓名全称能够更加准确地定位客户,这时候则需要将三列数据加在一起。现在我们需要讨论的就是如何正确的返回姓名全称。

首先来创建示例表:

CREATE TABLE Customers

first_name  char(10) NOT NULL,

middle_name char(10),

last_name   char(10)

INSERT INTO Customers

VALUES

('Jack',   'A.', 'Tuszynski'),

('Sisley', NULL, 'Weilage'),

('Eddie',  NULL, NULL);

如果直接进行简单的相加,你会发现在表19-19所示的查询结果中,只有第1行是正确的,第2行和第3行由于包含了NULL值,返回了NULL。

SELECT first_name + ' ' + middle_name + ' ' +last_name AS full_name

FROM Customers;

表19-19                                                                       查询结果

full_name

Jack       A.         Tuszynski

NULL

NULL

下面的语句使用CASE表达式进行NULL值判断,得到了正确的查询结果,如表19-20所示。

SELECT first_name +

CASEWHEN (middle_name IS NOT NULL) THEN middle_name

ELSE ''

END +

CASEWHEN (last_name IS NOT NULL) THEN last_name

ELSE ''

ENDAS full_name

FROM Customers;

表19-20                                                                       查询结果

full_name

Jack       A.         Tuszynski

Sisley    Weilage

Eddie

还有一种方法就是使用COALESCE(expression[ ,...n ] )函数,它可以返回表达式列表中不为空的第一个表达式。下面语句返回与上面相同的结果,语句中的COALESCE(middle_name, '')包含有middle_name和空字符串两个表达式,如果middle_name为空,则返回后面的空字符串,否则直接返回middle_name。

SELECT first_name +

COALESCE(middle_name, '') +

COALESCE(last_name, '') AS full_name

FROM Customers;

下面的语句则是使用RTRIM()函数去除了每列后面的多余空格。

SELECT RTRIM(first_name) + ' ' +

RTRIM(COALESCE(middle_name, '')) + ' ' +

RTRIM(COALESCE(last_name, '')) AS full_name

FROM Customers;

19.6.2 工资问题处理

这是在做工资计算时遇到的一个问题。在如表19-21所示的工资表中,Jack和Mary是按小时计算工资报酬,hour_sum中是累计工作小时,pay_per_h中是每小时的报酬额。而Joy和Nancy是按天计算工资报酬,day_sum中是累计工作天数,pay_per_day中是每天的报酬额。

表19-21                                                                工资表(Salary)

emp_name

hour_sum

pay_per_h

day_sum

pay_per_day

Jack

200

20.00

NULL

NULL

Mary

300

30.00

NULL

NULL

Joy

NULL

NULL

20

120.00

Nancy

NULL

NULL

22

100.00

现在要计算应付给每个人的工资总额,为了能够正确处理NULL值,这里仍旧使用COALESCE()函数,语句如下:

SELECT emp_name, COALESCE(hour_sum * pay_per_h,day_sum * pay_per_day) AS pay_all

FROM Salary;

返回结果如表19-22所示。

表19-22                                                                       工资总额

筛选不为空(’’)并且不为null: SELECT * FROM 表名 WHERE 字段名 IS NOT NULL AND NOT 字段名 = ‘’; SELECT * FROM 表名 WHERE 字段名 IS NOT NULL AND 字段名 <> ‘’; SELECT * FROM 表名 WHERE 字段名 IS NOT NULL AND 字段名 != ‘’; 学习 SQL 不简单, SQL 最难的当然是查询,一个小小的select,能把人玩死,下面是整理的 SQL 查询技巧,好好品品!select select * from student;all 查询所有 select all sex from student;distinct 过滤重复 select distinct sex from student;count 统计 select count(*) fro... Coalesce 获得参数 第一个不为空的表达式。语法:        COALESCE ( expression [ ,...n ] ) 例子:CREATE TABLE wages                /*创建表wages*/(   emp_id      tinyint    identity,   hourly_wage   decimal   NULL,   salary I have a Table which has the records of the down time of a server .I have created a simplified version of this table at sql fiddle. Please see here sql fiddleThe table has each record likeReason Month ... 我如何才能从查询 获取 非空 字段?是的,您可以使用现代的编程语言轻松完成此操作,但是通过从表 获取冗余信息可能会浪费资源,而且很多时候,它可能会添加冗余代码。从5.3版开始,此任务仅面向My SQL 。 您拥有大量的信息,其 包含大量的电子表格,csv,xml,bin,日志或纯文本文件,并且经过简化后,表 有几列没有 ,当然也没有NULL 。对于... SQL 运算符 //不为空SELECT * FROM `table_name` WHERE 'col'<>''//为空SELECT * FROM `table_name` WHERE 'col'='' SQL 命令 //不为空SELECT * FROM `table_name` WHERE 'colIS NOT NULL//为空SELECT * FROM `table_name... coalesce(SH.SH_TIME, DK.DK_TIME, RG.RG_TIME,PH.PH_TIME,TRG.TRG_TIME,QY.QY_TIME) as SH_TIME 换系统或者换数据库的时候,需要经常做数据迁移……在一张有很 多列 的数据表 ,想要找到我们想要的字段,对比数据字段,就显得 常重要!而在这么多的列 ,想要知道有那些列一定需要去对比, 常困难;有个步骤,可以提高工作效率!就是先找到数据表 非空 字段……排除掉这些,对比起来,效率更高!提供以下自己摸索出来的方法,供大家点评!呵呵! Create  PROCEDURE Getcolunmnlent_ COALESCE是一个函数, (expression_1, expression_2, ...,expression_n)依次参考各参数表达式,遇到 null 即停止并返回该 。如果所有的表达式都是 空值 ,最终将返回一个 空值 。使用COALESCE在于大部分包含 空值 的表达式最终将返回 空值 。 使用场景: 现需要统计学生上午和下午的测温数据,最终展示效果如下:学生名 上午温度 下午温度 上午温度为每天的00... 数据库应用软件很多时候将多重的、相关的实体信息保存在同一个表格 。例如,购买的零件和本地生产的零件都是零件,经理和工人都是员工,尽管多重的实体类型在数据存储上略有不同,但是它们有太多的相同之处,因此通常使用一个表格而不是 两个 。处理这样的表格通常意味着对每一行进行条件测试来检查哪个实体类型正在被处理,然后返回每种类型的不同结果集。CASE语句可以用来完成这一工作。从Oracle 9i版开始,