将第一个参数,从第start位置开始的length个字符(包含第start位置,位置从1开始),用第四个参数替换。
Syntax
![](http://i.msdn.microsoft.com/Global/Images/clear.gif)
- character_expression
-
Is an expression of character data. character_expression can be a constant, variable, or column of either character or binary data.
- start
-
Is an integer value that specifies the location to start deletion and insertion. If start or length is negative, a null string is returned. If start is longer than the first character_expression, a null string is returned. start can be of type bigint.
- length
-
Is an integer that specifies the number of characters to delete. If length is longer than the first character_expression, deletion occurs up to the last character in the last character_expression. length can be of type bigint.
![](http://i.msdn.microsoft.com/Global/Images/clear.gif)
If the start position or the length is negative, or if the starting position is larger than length of the first string, a null string is returned. If the length to delete is longer than the first string, it is deleted to the first character in the first string.
An error is raised if the resulting value is larger than the maximum supported by the return type.
![](http://i.msdn.microsoft.com/Global/Images/clear.gif)
The following example returns a character string created by deleting three characters from the first string, abcdef
, starting at position 2
, at b
, and inserting the second string at the deletion point.
SELECT STUFF('abcdef', 2, 3, 'ijklmn'); GO
Here is the result set.
--------- aijklmnef (1 row(s) affected)
2.COALESCE
从第一个表达式开始查找非NULL值。找到为止。如果全部为NULL,则返回NULL
Syntax
![](http://i.msdn.microsoft.com/Global/Images/clear.gif)
- expression
-
Is an expression of any type.
![](http://i.msdn.microsoft.com/Global/Images/clear.gif)
If all arguments are NULL, COALESCE returns NULL.
![]() |
---|
At least one of the null values must be a typed NULL. |
COALESCE(expression1,...n) is equivalent to the following CASE expression:
CASE
WHEN (expression1 IS NOT NULL) THEN expression1
WHEN (expression2 IS NOT NULL) THEN expression2
...
ELSE expressionN
END
ISNULL and COALESCE though equivalent, can behave differently. An expression involving ISNULL with non-null parameters is considered to be NOT NULL, while expressions involving COALESCE with non-null parameters is considered to be NULL. In SQL Server, to index expressions involving COALESCE with non-null parameters, the computed column can be persisted using the PERSISTED column attribute as in the following statement:
CREATE TABLE #CheckSumTest ( ID int identity , Num int DEFAULT ( RAND() * 100 ) , RowCheckSum AS COALESCE( CHECKSUM( id , num ) , 0 ) PERSISTED PRIMARY KEY );
![](http://i.msdn.microsoft.com/Global/Images/clear.gif)
Simple Example
The following example demonstrates how COALESCE selects the data from the first column that has a non-null value.
USE AdventureWorks ;
GO
SELECT Name, Class, Color, ProductNumber,
COALESCE(Class, Color, ProductNumber) AS FirstNotNull
FROM Production.Product ;
GO
Complex Example
In the following example, the wages
table includes three columns with information about the yearly wages of the employees: the hourly wage, salary, and commission. However, an employee receives only one type of pay. To determine the total amount paid to all employees, use COALESCE
to receive only the nonnull value found in hourly_wage
, salary
, and commission
.
SET NOCOUNT ON; GO USE tempdb; IF OBJECT_ID('dbo.wages') IS NOT NULL DROP TABLE wages; GO CREATE TABLE dbo.wages ( emp_id tinyint identity, hourly_wage decimal NULL, salary decimal NULL, commission decimal NULL, num_sales tinyint NULL ); GO INSERT dbo.wages (hourly_wage, salary, commission, num_sales) VALUES (10.00, NULL, NULL, NULL), (20.00, NULL, NULL, NULL), (30.00, NULL, NULL, NULL), (40.00, NULL, NULL, NULL), (NULL, 10000.00, NULL, NULL), (NULL, 20000.00, NULL, NULL), (NULL, 30000.00, NULL, NULL), (NULL, 40000.00, NULL, NULL), (NULL, NULL, 15000, 3), (NULL, NULL, 25000, 2), (NULL, NULL, 20000, 6), (NULL, NULL, 14000, 4); GO SET NOCOUNT OFF; GO SELECT CAST(COALESCE(hourly_wage * 40 * 52, salary, commission * num_sales) AS money) AS 'Total Salary' FROM dbo.wages ORDER BY 'Total Salary'; GO
Here is the result set.
Total Salary
------------
20800.0000
41600.0000
62400.0000
83200.0000
10000.0000
20000.0000
30000.0000
40000.0000
45000.0000
50000.0000
120000.0000
56000.0000
(12 row(s) affected)
![](http://i.msdn.microsoft.com/Global/Images/clear.gif)
Reference
ISNULL (Transact-SQL)CASE (Transact-SQL)