目录一、函数的种类二、算术函数2。1ABS绝对值2。2MOD求余2。3ROUND四舍五入三、字符串函数3。1拼接3。2LENGTH字符串长度3。3LOWER小写转换3。4REPLACE字符串的替换3。5SUBSTRING字符串的截取3。6UPPER大写转换四、日期函数4。1CURRENTDATE当前日期4。2CURRENTTIME当前时间4。3CURRENTTIMESTAMP当前日期和时间4。4EXTRACT截取日期元素五、转换函数5。1CAST类型转换5。2COALESCE将NULL转换为其他值 不仅SQL,对所有的编程语言来说,函数都起着至关重要的作用。函数就像是编程语言的道具箱,每种编程语言都准备了非常多的函数。 使用函数,我们可以实现计算、字符串操作、日期计算等各种各样的运算。本文重点 根据用途,函数可以大致分为算术函数、字符串函数、日期函数、转换函聚合函数。 函数的种类很多,无需全都记住,只需要记住具有代表性的函数就可以了,其他的可以在使用时再进行查询。一、函数的种类 前几篇和大家一起学习了SQL的语法结构等必须要遵守的规则。本文将会进行一点改变,来学习一些SQL自带的便利工具函数。 我们在SQL如何对表进行聚合和分组查询并对查询结果进行排序中已经学习了函数的概念,这里再回顾一下。所谓函数,就是输入某一值得到相应输出结果的功能,输入值称为参数(parameter),输出值称为返回值。 函数大致可以分为以下几种。算术函数(用来进行数值计算的函数)字符串函数(用来进行字符串操作的函数)日期函数(用来进行日期操作的函数)转换函数(用来转换数据类型和值的函数)聚合函数(用来进行数据聚合的函数) 我们已经在SQL如何对表进行聚合和分组查询并对查询结果进行排序中学习了聚合函数的相关内容,大家应该对函数有初步的了解了吧。 聚合函数基本上只包含COUNT、SUM、AVG、MAX、MIN这5种,而其他种类的函数总数则超过200种。 可能大家会觉得怎么会有那么多函数啊,但其实并不需要担心,虽然数量众多,但常用函数只有3050个。不熟悉的函数大家可以查阅参考文档(词典)来了解〔1〕。 本文我们将学习一些具有代表性的函数。大家并不需要一次全部记住,只需要知道有这样的函数就可以了,实际应用时可以查阅参考文档。 接下来,让我们来详细地看一看这些函数。二、算术函数 算术函数是最基本的函数,其实之前我们已经学习过了,可能有些读者已经想起来了。没错,就是算术运算符和比较运算符介绍的加减乘除四则运算。(加法)(减法)(乘法)(除法) 由于这些算术运算符具有根据输入值返回相应输出结果的功能,因此它们是出色的算术函数。在此我们将会给大家介绍除此之外的具有代表性的函数。 为了学习算术函数,我们首先根据代码清单1创建一张示例用表(SampleMath)。 NUMERIC是大多数DBMS都支持的一种数据类型,通过NUMBERIC(全体位数,小数位数)的形式来指定数值的大小。 接下来,将会给大家介绍常用的算术函数ROUND函数,由于PostgreSQL中的ROUND函数只能使用NUMERIC类型的数据,因此我们在示例中也使用了该数据类型。 代码清单1创建SampleMath表DDL:创建表CREATETABLESampleMath(mNUMERIC(10,3),nINTEGER,pINTEGER); SQLServerPostgreSQLDML:插入数据BEGINTRANSACTION;INSERTINTOSampleMath(m,n,p)VALUES(500,0,NULL);INSERTINTOSampleMath(m,n,p)VALUES(180,0,NULL);INSERTINTOSampleMath(m,n,p)VALUES(NULL,NULL,NULL);INSERTINTOSampleMath(m,n,p)VALUES(NULL,7,3);INSERTINTOSampleMath(m,n,p)VALUES(NULL,5,2);INSERTINTOSampleMath(m,n,p)VALUES(NULL,4,NULL);INSERTINTOSampleMath(m,n,p)VALUES(8,NULL,3);INSERTINTOSampleMath(m,n,p)VALUES(2。27,1,NULL);INSERTINTOSampleMath(m,n,p)VALUES(5。555,2,NULL);INSERTINTOSampleMath(m,n,p)VALUES(NULL,1,NULL);INSERTINTOSampleMath(m,n,p)VALUES(8。76,NULL,NULL);COMMIT;特定的SQL 不同的DBMS事务处理的语法也不尽相同。代码清单1中的DML语句在MySQL中执行时,需要将部分更改为STARTTRANSACTION;,在Oracle和DB2中执行时,无需用到的部分(请删除)。 详细内容请大家参考什么是SQL事务中的创建事务。 下面让我们来确认一下创建好的表中的内容,其中应该包含了m、n、p三列。SELECTFROMSampleMath; 执行结果:mnp500。0000180。0000735248。00032。27015。555218。7602。1ABS绝对值 语法1ABS函数ABS(数值) ABS是计算绝对值的函数。绝对值(absolutevalue)不考虑数值的符号,表示一个数到原点的距离。 简单来讲,绝对值的计算方法就是:0和正数的绝对值就是其本身,负数的绝对值就是去掉符号后的结果。 代码清单2计算数值的绝对值SELECTm,ABS(m)ASabscolFROMSampleMath; 执行结果: 右侧的abscol列就是通过ABS函数计算出的m列的绝对值。请大家注意,180的绝对值就是去掉符号后的结果180。 通过上述结果我们可以发现,ABS函数的参数为NULL时,结果也是NULL。并非只有ABS函数如此,其实绝大多数函数对于NULL都返回NULL〔2〕。2。2MOD求余 语法2MOD函数MOD(被除数,除数) MOD是计算除法余数(求余)的函数,是modulo的缩写。例如,73的余数是1,因此MOD(7,3)的结果也是1(代码清单3)。 因为小数计算中并没有余数的概念,所以只能对整数类型的列使用MOD函数。 代码清单3计算除法(np)的余数 OracleDB2PostgreSQLMySQLSELECTn,p,MOD(n,p)ASmodcolFROMSampleMath; 执行结果:npmodcol0073152143121 这里有一点需要大家注意:主流的DBMS都支持MOD函数,只有SQLServer不支持该函数。特定的SQL SQLServer使用特殊的运算符(函数)来计算余数,使用如下的专用语法可以得到与代码清单3相同的结果。需要使用SQLServer的读者需要特别注意。 SQLServer SELECTn,p,npASmodcolFROMSampleMath;2。3ROUND四舍五入 语法3ROUND函数ROUND(对象数值,保留小数的位数) ROUND函数用来进行四舍五入操作。四舍五入在英语中称为round。 如果指定四舍五入的位数为1,那么就会对小数点第2位进行四舍五入处理。如果指定位数为2,那么就会对第3位进行四舍五入处理(代码清单4)。 代码清单4对m列的数值进行n列位数的四舍五入处理SELECTm,n,ROUND(m,n)ASroundcolFROMSampleMath; 执行结果:mnroundcol500。0000500180。00001807548。0002。27012。35。55525。5618。760三、字符串函数 截至目前,我们介绍的函数都是主要针对数值的算术函数,但其实算术函数只是SQL(其他编程语言通常也是如此)自带的函数中的一部分。 虽然算术函数是我们经常使用的函数,但是字符串函数也同样经常被使用。 在日常生活中,我们经常会像使用数字那样,对字符串进行替换、截取、简化等操作,因此SQL也为我们提供了很多操作字符串的功能。 为了学习字符串函数,我们再来创建一张表(SampleStr),参见代码清单5。 代码清单5创建SampleStr表DDL:创建表CREATETABLESampleStr(str1VARCHAR(40),str2VARCHAR(40),str3VARCHAR(40)); SQLServerPostgreSQLDML:插入数据BEGINTRANSACTION;INSERTINTOSampleStr(str1,str2,str3)VALUES(opx,rt,NULL);INSERTINTOSampleStr(str1,str2,str3)VALUES(abc,def,NULL);INSERTINTOSampleStr(str1,str2,str3)VALUES(山田,太郎,是我);INSERTINTOSampleStr(str1,str2,str3)VALUES(aaa,NULL,NULL);INSERTINTOSampleStr(str1,str2,str3)VALUES(NULL,xyz,NULL);INSERTINTOSampleStr(str1,str2,str3)VALUES(!,NULL,NULL);INSERTINTOSampleStr(str1,str2,str3)VALUES(ABC,NULL,NULL);INSERTINTOSampleStr(str1,str2,str3)VALUES(aBC,NULL,NULL);INSERTINTOSampleStr(str1,str2,str3)VALUES(abc太郎,abc,ABC);INSERTINTOSampleStr(str1,str2,str3)VALUES(abcdefabc,abc,ABC);INSERTINTOSampleStr(str1,str2,str3)VALUES(micmic,i,I);COMMIT;特定的SQL 不同的DBMS事务处理的语法也不尽相同。代码清单5中的DML语句在MySQL中执行时,需要将部分更改为STARTTRANSACTION;。在Oracle和DB2中执行时,无需用到的部分(请删除)。 详细内容请大家参考什么是SQL事务中的创建事务。 下面让我们来确认一下创建好的表中的内容,其中应该包含了str1、str2、str3三列。SELECTFROMSampleStr; 执行结果:str1str2str3opxrtabcdef山田太郎是我aaaxyz!ABCaBCabc太郎abcABCabcdefabcabcABCmicmiciI3。1拼接 语法4函数字符串1字符串2 在实际业务中,我们经常会碰到abcdeabcde这样希望将字符串进行拼接的情况。在SQL中,可以通过由两条并列的竖线变换而成的函数来实现(代码清单6)。 代码清单6拼接两个字符串(str1str2) OracleDB2PostgreSQLSELECTstr1,str2,str1str2ASstrconcatFROMSampleStr; 执行结果:str1str2strconcatopxrtopxrtabcdefabcdef山田太郎山田太郎aaaxyz!ABCaBCabc太郎abcabc太郎abcabcdefabcabcabcdefabcabcmicmicimicmaci 进行字符串拼接时,如果其中包含NULL,那么得到的结果也是NULL。这是因为也是变了形的函数。当然,三个以上的字符串也可以进行拼接(代码清单7)。 代码清单7拼接三个字符串(str1str2str3) OracleDB2PostgreSQLSELECTstr1,str2,str3,str1str2str3ASstrconcatFROMSampleStrWHEREstr1山田; 执行结果:str1str2str3strconcat山田太郎是我山田太郎是我 这里也有一点需要大家注意,函数在SQLServer和MySQL中无法使用。特定的SQL SQLServer使用运算符(函数)来连接字符串。MySQL使用CONCAT函数来完成字符串的拼接。 使用如下SQLServerMySQL的专用语法能够得到与代码清单7相同的结果。另外,在SQLServer2012及其之后的版本中也可以使用CONCAT函数。 SQLServer SELECTstr1,str2,str3,str1str2str3ASstrconcatFROMSampleStr; MySQLSQLServer2012及之后 SELECTstr1,str2,str3,CONCAT(str1,str2,str3)ASstrconcatFROMSampleStr;3。2LENGTH字符串长度 语法5LENGTH函数LENGTH(字符串) 想要知道字符串中包含多少个字符时,可以使用LENGTH(长度)函数(代码清单8)。 代码清单8计算字符串长度 OracleDB2PostgreSQLMySQLSELECTstr1,LENGTH(str1)ASlenstrFROMSampleStr; 执行结果:str1lenstropx3abc3山田2aaa3!5ABC3aBC3abc太郎5abcdefabc9micmic6 需要注意的是,该函数也无法在SQLServer中使用。特定的SQL SQLServer使用LEN函数来计算字符串的长度。使用如下SQLServer的专用语法能够得到与代码清单8相同的结果。 SQLServer SELECTstr1,LEN(str1)ASlenstrFROMSampleStr; 我想大家应该逐渐明白SQL中有很多特定的用法这句话的含义了吧。专栏 对1个字符使用LENGTH函数有可能得到2字节以上的结果 LENGTH函数中,还有一点需要大家特别注意,那就是该函数究竟以什么为单位来计算字符串的长度。这部分是初级以上阶段才会学习到的内容,在此先简单介绍一下。 可能有些读者已经有所了解,与半角英文字母占用1字节不同,汉字这样的全角字符会占用2个以上的字节(称为多字节字符)。 因此,使用MySQL中的LENGTH这样以字节为单位的函数进行计算时,LENGTH(山田)的返回结果是4。同样是LENGTH函数,不同DBMS的执行结果也不尽相同。3。3LOWER小写转换 语法6LOWER函数LOWER(字符串) LOWER函数只能针对英文字母使用,它会将参数中的字符串全都转换为小写(代码清单9)。 因此,该函数并不适用于英文字母以外的场合。此外,该函数并不影响原本就是小写的字符。 代码清单9大写转换为小写SELECTstr1,LOWER(str1)ASlowstrFROMSampleStrWHEREstr1IN(ABC,aBC,abc,山田); 执行结果:str1lowstrabcabc山田山田ABCabcaBCabc 既然存在小写转换函数,那么肯定也有大写转换函数,UPPER就是大写转换函数。3。4REPLACE字符串的替换 语法7REPLACE函数REPLACE(对象字符串,替换前的字符串,替换后的字符串) 使用REPLACE函数,可以将字符串的一部分替换为其他的字符串(代码清单10)。 代码清单10替换字符串的一部分SELECTstr1,str2,str3,REPLACE(str1,str2,str3)ASrepstrFROMSampleStr; 执行结果:str1str2str3repstropxrtabcdef山田太郎是我山田aaaxyz!ABCaBCabc太郎abcABCABC太郎abcdefabcabcABCABCdefABCmicmiciImIcmIc3。5SUBSTRING字符串的截取 语法8SUBSTRING函数(PostgreSQLMySQL专用语法)SUBSTRING(对象字符串FROM截取的起始位置FOR截取的字符数) 使用SUBSTRING函数可以截取出字符串中的一部分字符串(代码清单11)。截取的起始位置从字符串最左侧开始计算〔3〕。 代码清单11截取出字符串中第3位和第4位的字符 PostgreSQLMySQLSELECTstr1,SUBSTRING(str1FROM3FOR2)ASsubstrFROMSampleStr; 执行结果:str1substropxxabcc山田aaaa!ABCCaBCCabc太郎c太abcdefabccdmicmiccm 虽然上述SUBSTRING函数的语法是标准SQL承认的正式语法,但是现在只有PostgreSQL和MySQL支持该语法。特定的SQL SQLServer将语法a中的内容进行了简化(语法b)。 语法aSUBSTRING函数(SQLServer专用语法) SUBSTRING(对象字符串,截取的起始位置,截取的字符数) Oracle和DB2将该语法进一步简化,得到了如下结果。 语法bSUBSTR函数(OracleDB2专用语法) SUBSTR(对象字符串,截取的起始位置,截取的字符数) SQL有这么多特定的语法,真是有些让人头疼啊。各DBMS中能够得到与代码清单11相同结果的专用语法如下所示。 SQLServer SELECTstr1,SUBSTRING(str1,3,2)ASsubstrFROMSampleStr; OracleDB2 SELECTstr1,SUBSTR(str1,3,2)ASsubstrFROMSampleStr;3。6UPPER大写转换 语法9UPPER函数UPPER(字符串) UPPER函数只能针对英文字母使用,它会将参数中的字符串全都转换为大写(代码清单12)。 因此,该函数并不适用于英文字母以外的情况。此外,该函数并不影响原本就是大写的字符。 代码清单12将小写转换为大写SELECTstr1,UPPER(str1)ASupstrFROMSampleStrWHEREstr1IN(ABC,aBC,abc,山田); 执行结果:str1upstrabcABC山田山田ABCABCaBCABC 与之相对,进行小写转换的是LOWER函数。四、日期函数 虽然SQL中有很多日期函数,但是其中大部分都依存于各自的DBMS,因此无法统一说明〔4〕。本节将会介绍那些被标准SQL承认的可以应用于绝大多数DBMS的函数。4。1CURRENTDATE当前日期 语法10CURRENTDATE函数CURRENTDATE CURRENTDATE函数能够返回SQL执行的日期,也就是该函数执行时的日期。由于没有参数,因此无需使用括号。 执行日期不同,CURRENTDATE函数的返回值也不同。如果在2009年12月13日执行该函数,会得到返回值20091213。如果在2010年1月1日执行,就会得到返回值20100101(代码清单13)。 代码清单13获得当前日期SELECTCURRENTDATE; 执行结果:date20160525 该函数无法在SQLServer中执行。此外,Oracle和DB2中的语法略有不同。特定的SQL SQLServer使用如下的CURRENTTIMESTAMP(后述)函数来获得当前日期。 SQLServer 使用CAST(后述)函数将CURRENTTIMESTAMP转换为日期类型SELECTCAST(CURRENTTIMESTAMPASDATE)ASCURDATE; 执行结果: CURDATE20100525 在Oracle中使用该函数时,需要在FROM子句中指定临时表(DUAL)。 而在DB2中使用时,需要在CRUUENT和DATE之间添加半角空格,并且还需要指定临时表SYSIBM。SYSDUMMY1(相当于Oracle中的DUAL)。 这些容易混淆的地方请大家多加注意。 Oracle SELECTCURRENTDATEFROMdual; DB2 SELECTCURRENTDATEFROMSYSIBM。SYSDUMMY1;4。2CURRENTTIME当前时间 语法11CURRENTTIME函数CURRENTTIME CURRENTTIME函数能够取得SQL执行的时间,也就是该函数执行时的时间(代码清单14)。由于该函数也没有参数,因此同样无需使用括号。 代码清单14取得当前时间 PostgreSQLMySQLSELECTCURRENTTIME; 执行结果:timetz17:26:50。99509 该函数同样无法在SQLServer中执行,在Oracle和DB2中的语法同样略有不同。特定的SQL SQLServer使用如下的CURRENTTIMESTAMP函数(后述)来获得当前日期。 使用CAST函数(后述)将CURRENTTIMESTAMP转换为时间类型SELECTCAST(CURRENTTIMESTAMPASTIME)ASCURTIME; 执行结果: CURTIME21:33:59。3400000 在Oracle和DB2中使用时的语法如下所示。需要注意的地方和CURRENTDATE函数相同。在Oracle中使用时所得到的结果还包含日期。 Oracle 指定临时表(DUAL)SELECTCURRENTTIMESTAMPFROMdual; DB2 CURRENT和TIME之间使用了半角空格,指定临时表SYSIBM。SYSDUMMY1SELECTCURRENTTIMEFROMSYSIBM。SYSDUMMY1;4。3CURRENTTIMESTAMP当前日期和时间 语法12CURRENTTIMESTAMP函数CURRENTTIMESTAMP CURRENTTIMESTAMP函数具有CURRENTDATECURRENTTIME的功能。使用该函数可以同时得到当前的日期和时间,当然也可以从结果中截取日期或者时间。 代码清单15取得当前日期和时间 SQLServerPostgreSQLMySQLSELECTCURRENTTIMESTAMP; 执行结果:now2016042518:31:03。70409 该函数可以在SQLServer等各个主要的DBMS中使用〔5〕。但是,与之前的CURRENTDATE和CURRENTTIME一样,在Oracle和DB2中该函数的语法略有不同。特定的SQL Oracle和DB2使用如下写法可以得到与代码清单15相同的结果。其中需要注意的地方与CURRENTDATE时完全相同。 Oracle 指定临时表(DUAL)SELECTCURRENTTIMESTAMPFROMdual; DB2 CURRENT和TIME之间使用了半角空格,指定临时表SYSIBM。SYSDUMMY1SELECTCURRENTTIMESTAMPFROMSYSIBM。SYSDUMMY1;4。4EXTRACT截取日期元素 语法13EXTRACT函数EXTRACT(日期元素FROM日期) 使用EXTRACT函数可以截取出日期数据中的一部分,例如年月,或者小时秒等(代码清单16)。该函数的返回值并不是日期类型而是数值类型。 代码清单16截取日期元素 PostgreSQLMySQLSELECTCURRENTTIMESTAMP,EXTRACT(YEARFROMCURRENTTIMESTAMP)ASyear,EXTRACT(MONTHFROMCURRENTTIMESTAMP)ASmonth,EXTRACT(DAYFROMCURRENTTIMESTAMP)ASday,EXTRACT(HOURFROMCURRENTTIMESTAMP)AShour,EXTRACT(MINUTEFROMCURRENTTIMESTAMP)ASminute,EXTRACT(SECONDFROMCURRENTTIMESTAMP)ASsecond; 执行结果:nowyearmonthdayhourminutesecond2010042519:07:33。98709201042519733。987 需要注意的是SQLServer也无法使用该函数。特定的SQL SQLServer使用如下的DATEPART函数会得到与代码清单16相同的结果。 SQLServer SELECTCURRENTTIMESTAMP,DATEPART(YEAR,CURRENTTIMESTAMP)ASyear,DATEPART(MONTH,CURRENTTIMESTAMP)ASmonth,DATEPART(DAY,CURRENTTIMESTAMP)ASday,DATEPART(HOUR,CURRENTTIMESTAMP)AShour,DATEPART(MINUTE,CURRENTTIMESTAMP)ASminute,DATEPART(SECOND,CURRENTTIMESTAMP)ASsecond; Oracle和DB2想要得到相同结果的话,需要进行如下改变。注意事项与CURRENTDATE时完全相同。 Oracle 在FROM子句中指定临时表(DUAL)SELECTCURRENTTIMESTAMP,EXTRACT(YEARFROMCURRENTTIMESTAMP)ASyear,EXTRACT(MONTHFROMCURRENTTIMESTAMP)ASmonth,EXTRACT(DAYFROMCURRENTTIMESTAMP)ASday,EXTRACT(HOURFROMCURRENTTIMESTAMP)AShour,EXTRACT(MINUTEFROMCURRENTTIMESTAMP)ASminute,EXTRACT(SECONDFROMCURRENTTIMESTAMP)ASsecondFROMDUAL; DB2 CURRENT和TIME之间使用了半角空格,指定临时表SYSIBM。SYSDUMMY1SELECTCURRENTTIMESTAMP,EXTRACT(YEARFROMCURRENTTIMESTAMP)ASyear,EXTRACT(MONTHFROMCURRENTTIMESTAMP)ASmonth,EXTRACT(DAYFROMCURRENTTIMESTAMP)ASday,EXTRACT(HOURFROMCURRENTTIMESTAMP)AShour,EXTRACT(MINUTEFROMCURRENTTIMESTAMP)ASminute,EXTRACT(SECONDFROMCURRENTTIMESTAMP)ASsecondFROMSYSIBM。SYSDUMMY1;五、转换函数 最后将要给大家介绍一类比较特殊的函数转换函数。虽说有些特殊,但是由于这些函数的语法和之前介绍的函数类似,数量也比较少,因此很容易记忆。 转换这个词的含义非常广泛,在SQL中主要有两层意思:一是数据类型的转换,简称为类型转换,在英语中称为cast〔6〕;另一层意思是值的转换。5。1CAST类型转换 语法14CAST函数CAST(转换前的值AS想要转换的数据类型) 进行类型转换需要使用CAST函数。 之所以需要进行类型转换,是因为可能会插入与表中数据类型不匹配的数据,或者在进行运算时由于数据类型不一致发生了错误,又或者是进行自动类型转换会造成处理速度低下。 这些时候都需要事前进行数据类型转换(代码清单17、代码清单18)。 代码清单17将字符串类型转换为数值类型 SQLServerPostgreSQLSELECTCAST(0001ASINTEGER)ASintcol; MySQLSELECTCAST(0001ASSIGNEDINTEGER)ASintcol; OracleSELECTCAST(0001ASINTEGER)ASintcolFROMDUAL; DB2SELECTCAST(0001ASINTEGER)ASintcolFROMSYSIBM。SYSDUMMY1; 执行结果:intcol1 代码清单18将字符串类型转换为日期类型 SQLServerPostgreSQLMySQLSELECTCAST(20091214ASDATE)ASdatecol; OracleSELECTCAST(20091214ASDATE)ASdatecolFROMDUAL; DB2SELECTCAST(20091214ASDATE)ASdatecolFROMSYSIBM。SYSDUMMY1; 执行结果:datecol20091214 从上述结果可以看到,将字符串类型转换为整数类型时,前面的000消失了,能够切实感到发生了转换。 但是,将字符串转换为日期类型时,从结果上并不能看出数据发生了什么变化,理解起来也比较困难。 从这一点我们也可以看出,类型转换其实并不是为了方便用户使用而开发的功能,而是为了方便DBMS内部处理而开发的功能。5。2COALESCE将NULL转换为其他值 语法15COALESCE函数COALESCE(数据1,数据2,数据3) COALESCE是SQL特有的函数。该函数会返回可变参数〔7〕中左侧开始第1个不是NULL的值。参数个数是可变的,因此可以根据需要无限增加。 其实转换函数的使用还是非常频繁的。在SQL语句中将NULL转换为其他值时就会用到转换函数(代码清单19、代码清单20)。 就像之前我们学习的那样,运算或者函数中含有NULL时,结果全都会变为NULL。能够避免这种结果的函数就是COALESCE。 代码清单19将NULL转换为其他值 SQLServerPostgreSQLMySQLSELECTCOALESCE(NULL,1)AScol1,COALESCE(NULL,test,NULL)AScol2,COALESCE(NULL,NULL,20091101)AScol3; OracleSELECTCOALESCE(NULL,1)AScol1,COALESCE(NULL,test,NULL)AScol2,COALESCE(NULL,NULL,20091101)AScol3FROMDUAL; DB2SELECTCOALESCE(NULL,1)AScol1,COALESCE(NULL,test,NULL)AScol2,COALESCE(NULL,NULL,20091101)AScol3FROMSYSIBM。SYSDUMMY1; 执行结果:col1col2col31test20091101 代码清单20使用SampleStr表中的列作为例子SELECTCOALESCE(str2,NULL)FROMSampleStr; 执行结果:coalescertdef太郎NULLxyzNULLNULLNULLabcabci 这样,即使包含NULL的列,也可以通过COALESCE函数转换为其他值之后再应用到函数或者运算当中,这样结果就不再是NULL了。 此外,多数DBMS中都提供了特有的COALESCE的简化版函数(如Oracle中的NVL等),但由于这些函数都依存于各自的DBMS,因此还是推荐大家使用通用的COALESCE函数。参考文档是DBMS手册的一部分。大家也可以从介绍各种函数的书籍以及Web网站上获取相关信息。但是转换函数中的COALESCE函数除外。需要大家注意的是,该函数也存在和LENGTH函数同样的多字节字符的问题。详细内容请大家参考专栏对1个字符使用LENGTH函数有可能得到2字节以上的结果。如果想要了解日期函数的详细内容,目前只能查阅各个DBMS的手册。之前我们已经介绍过,在SQLServer中无法使用CURRENTDATE和CURRENTTIME函数。可能是因为在SQLServer中,CURRENTTIMESTAMP已经涵盖了这两者的功能吧。类型转换在一般的编程语言中也会使用,因此并不是SQL特有的功能。参数的个数并不固定,可以自由设定个数的参数。