一个非常有用的函数——COALESCE

转:http://blog.csdn.net/dba_huangzj/article/details/8300784

很多人知道ISNULL函数,但是很少人知道Coalesce函数,人们会无意中使用到Coalesce函数,并且发现它比ISNULL更加强大,其实到目前为止,这个函数的确非常有用,本文主要讲解其中的一些基本使用:

首先看看联机丛书的简要定义:

返回其参数中第一个非空表达式

语法:

COALESCE ( expression [ ,...n ] ) 

如果所有参数均为 NULL,则 COALESCE 返回 NULL。至少应有一个 Null 值为 NULL 类型。尽管 ISNULL 等同于 COALESCE,但它们的行为是不同的。包含具有非空参数的 ISNULL 的表达式将视为 NOT NULL,而包含具有非空参数的 COALESCE 的表达式将视为 NULL。在 SQL Server 中,若要对包含具有非空参数的 COALESCE 的表达式创建索引,可以使用 PERSISTED 列属性将计算列持久化,如以下语句所示:

[sql] view plaincopyprint?

  1. CREATE TABLE #CheckSumTest
  2. (
  3. ID int identity ,
  4. Num int DEFAULT ( RAND() * 100 ) ,
  5. RowCheckSum AS COALESCE( CHECKSUM( id , num ) , 0 ) PERSISTED PRIMARY KEY
  6. );

下面来看几个比较有用的例子:

首先,从MSDN上看看这个函数的使用方法,coalesce函数(下面简称函数),返回一个参数中非空的值。如:

[sql] view plaincopyprint?

  1. SELECT  COALESCE(NULL, NULL, GETDATE())

由于两个参数都为null,所以返回getdate()函数的值,也就是当前时间。即返回第一个非空的值。由于这个函数是返回第一个非空的值,所以参数里面必须最少有一个非空的值,如果使用下面的查询,将会报错:

[sql] view plaincopyprint?

  1. SELECT  COALESCE(NULL, NULL, NULL)

然后来看看把函数应用到Pivot中,下面语句在AdventureWorks 数据库上运行:

[sql] view plaincopyprint?

  1. SELECT  Name
  2. FROM    HumanResources.Department
  3. WHERE   ( GroupName= ‘Executive Generaland Administration‘ )

会得到下面的结果:

如果想扭转结果,可以使用下面的语句:

[sql] view plaincopyprint?

  1. DECLARE @DepartmentName VARCHAR(1000)
  2. SELECT  @DepartmentName = COALESCE(@DepartmentName, ‘‘) + Name + ‘;‘
  3. FROM    HumanResources.Department
  4. WHERE   ( GroupName= ‘Executive Generaland Administration‘ )
  5. SELECT  @DepartmentName AS DepartmentNames

使用函数来执行多条SQL命令:

当你知道这个函数可以进行扭转之后,你也应该知道它可以运行多条SQL命令。并且使用分号来区分独立的操作。下面语句是在Person架构下,有名字为Name的列的值:

[sql] view plaincopyprint?

  1. DECLARE @SQL VARCHAR(MAX)
  2. CREATE TABLE #TMP
  3. (Clmn VARCHAR(500),
  4. Val VARCHAR(50))
  5. SELECT @SQL=COALESCE(@SQL,‘‘)+CAST(‘INSERT INTO #TMP Select ‘‘‘ + TABLE_SCHEMA + ‘.‘ + TABLE_NAME + ‘.‘
  6. + COLUMN_NAME + ‘‘‘ AS Clmn, Name FROM ‘ + TABLE_SCHEMA + ‘.[‘ + TABLE_NAME +
  7. ‘];‘ AS VARCHAR(MAX))
  8. FROM INFORMATION_SCHEMA.COLUMNS
  9. JOIN sysobjects B ON INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = B.NAME
  10. WHERE COLUMN_NAME = ‘Name‘
  11. AND xtype = ‘U‘
  12. AND TABLE_SCHEMA = ‘Person‘
  13. PRINT @SQL
  14. EXEC(@SQL)
  15. SELECT * FROM #TMP
  16. DROP TABLE #TMP

 

 

还有一个很重要的功能:。当你尝试还原一个库,并发现不能独占访问时,这个功能非常有效。我们来打开多个窗口,来模拟一下多个连接。然后执行下面的脚本:

[sql] view plaincopyprint?

  1. DECLARE @SQL VARCHAR(8000)
  2. SELECT  @SQL = COALESCE(@SQL, ‘‘) + ‘Kill ‘ + CAST(spid AS VARCHAR(10)) + ‘; ‘
  3. FROM    sys.sysprocesses
  4. WHERE   DBID = DB_ID(‘AdventureWorks‘)
  5. PRINT @SQL --EXEC(@SQL) Replace the print statement with exec to execute

结果如下:

然后你可以把结果复制出来,然后一次性杀掉所有session。

时间: 2024-11-05 06:26:58

一个非常有用的函数——COALESCE的相关文章

<转>SQL函数——COALESCE

转载地址:http://blog.csdn.net/dba_huangzj/article/details/8300784# 目录 首先看看联机丛书的简要定义 语法 下面来看几个比较有用的例子 首先从MSDN上看看这个函数的使用方法coalesce函数下面简称函数返回一个参数中非空的值如 然后来看看把函数应用到Pivot中下面语句在AdventureWorks 数据库上运行 如果想扭转结果可以使用下面的语句 使用函数来执行多条SQL命令 还有一个很重要的功能当你尝试还原一个库并发现不能独占访问时

PHP培训教程 PHP里10个鲜为人知但却非常有用的函数

PHP培训教程 PHP里10个鲜为人知但却非常有用的函数 php里有非常丰富的内置函数,很多我们都用过,但仍有很多的函数我们大部分人都不熟悉,可它们却十分的有用.这篇文章里,兄弟连小编列举了一些PHP培训鲜为人知但会让你眼睛一亮的PHP函数. levenshtein() 你有没有经历过需要知道两个单词有多大的不同的时候,这个函数就是来帮你解决这个问题的.它能比较出两个字符串的不同程度. 用法: <?php $str1 = "carrot"; $str2 = "carrr

dbus 创建Client过程中几个有用的函数

/**  * g_type_init:  *  * This function used to initialise the type system.  Since GLib 2.36,  * the type system is initialised automatically and this function does  * nothing.  *  * Deprecated: 2.36: the type system is now initialised automatically

【js编程艺术】 之有用的函数

学习js的过程中有几个有用的函数. //添加事件函数 function addLoadEvent(func) { var oldonload = window.onload; if(typeof window.onload != "function"){ window.onload = func; }else{ window.onload = function(){ oldonload(); func(); } } } //功能:将新节点newElement添加到目标节点targetE

PHP里10个鲜为人知但却非常有用的函数

PHP里有非常丰富的内置函数,很多我们都用过,但仍有很多的函数我们大部分人都不熟悉,可它们却十分的有用.这篇文章里,我列举了一些鲜为人知但会让你眼睛一亮的PHP函数. levenshtein() 你有没有经历过需要知道两个单词有多大的不同的时候,这个函数就是来帮你解决这个问题的.它能比较出两个字符串的不同程度. 用法: <?php $str1 = "carrot"; $str2 = "carrrott"; echo levenshtein($str1, $st

微软未公开存储过程及有用的函数

原文:微软未公开存储过程及有用的函数 从网上收集,有些已经在2008不支持或者后续版本不支持,所以需要慎用. XP_FileExist: 用法:EXEC xp_fileexist <filename> [, <file_exists INT> OUTPUT] 例子:exec master.dbo.xp_fileexist 'C:\temp' SP_MSForEachDb: 例子1:exec dbo.sp_MSforeachdb 'select ''?'', * from [?].I

面试题之java 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 要求不能出现截半的情况

题目:10. 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串. 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”. 一.需要分析 1.输入为一个字符串和字节数,输出为按字节截取的字符串-------------->按照字节[byte]截取操作字符串,先将String转换成byte类型 .2.汉字不可以截半----------------------------------

c语言:编写一个输出链表的函数print

编写一个输出链表的函数print. 解:程序: #include<stdio.h> #include<stdlib.h> #define LEN sizeof(struct Student) struct Student { long num; float score; struct Student *next; }; int n; struct Student *creat()//建立链表的函数 { struct Student *head; struct Student *p1

一个奇怪的JS函数

今天在分析一个jQuery插件源码的时候,发现了一个奇怪的函数. // add leading zeros var pad = function(x){return (1e15+""+x).slice(-2)}; 首先1e15是什么意思? 也不是十六进制表示法. 不管三七21,直接F12打开命令窗口,执行下看看,结果是1后面有15个0. 原来1e15是科学计数法,表示1乘以10的15次方. var y=123e5; // 12300000 var z=123e-5; // 0.0012