Use scalar functions
Scalar functions return a single value and usually work on a single row of data. The number of input values they take can be zero (for example, GETDATE), one (for example, UPPER), or multiple (for example, ROUND). Because scalar functions always return a single value, they can be used anywhere a single value (the result) is needed. They are most commonly used in SELECT clauses and WHERE clause predicates. They can also be used in the SET clause of an UPDATE statement.
Built-in scalar functions can be organized into many categories, such as string, conversion, logical, mathematical, and others. This module will look at a few common scalar functions.
Some considerations when using scalar functions include:
- Determinism: If the function returns the same value for the same input and database state each time it is called, we say it is deterministic. For example, ROUND(1.1, 0) always returns the value 1.0. Many built-in functions are nondeterministic. For example, GETDATE() returns the current date and time. Results from nondeterministic functions cannot be indexed, which affects the query processor's ability to come up with a good plan for executing the query.
- Collation: When using functions that manipulate character data, which collation will be used? Some functions use the collation (sort order) of the input value; others use the collation of the database if no input collation is supplied.
Scalar function examples
At the time of writing, the SQL Server Technical Documentation listed more than 200 scalar functions that span multiple categories, including:
- Configuration functions
- Conversion functions
- Cursor functions
- Date and Time functions
- Mathematical functions
- Metadata functions
- Security functions
- String functions
- System functions
- System Statistical functions
- Text and Image functions
There isn't enough time in this course to describe each function, but the examples below show some commonly used functions.
The following hypothetical example uses several date and time functions:
SELECT SalesOrderID,
OrderDate,
YEAR(OrderDate) AS OrderYear,
DATENAME(mm, OrderDate) AS OrderMonth,
DAY(OrderDate) AS OrderDay,
DATENAME(dw, OrderDate) AS OrderWeekDay,
DATEDIFF(yy,OrderDate, GETDATE()) AS YearsSinceOrder
FROM Sales.SalesOrderHeader;
Partial results are shown below:
SalesOrderID
OrderDate
OrderYear
OrderMonth
OrderDay
OrderWeekDay
YearsSinceOrder
71774
2008-06-01T00:00:00
2008
June
1
Sunday
13
...
...
...
...
...
...
...
The next example includes some mathematical functions:
SELECT TaxAmt,
ROUND(TaxAmt, 0) AS Rounded,
FLOOR(TaxAmt) AS Floor,
CEILING(TaxAmt) AS Ceiling,
SQUARE(TaxAmt) AS Squared,
SQRT(TaxAmt) AS Root,
LOG(TaxAmt) AS Log,
TaxAmt * RAND() AS Randomized
FROM Sales.SalesOrderHeader;
Partial results:
TaxAmt
Rounded
Floor
Ceiling
Squared
Root
Log
Randomized
70.4279
70.0000
70.0000
71.0000
4960.089098
8.392133221
4.254589491
28.64120429
...
..
...
...
...
...
...
...
The following example uses some string functions:
SELECT CompanyName,
UPPER(CompanyName) AS UpperCase,
LOWER(CompanyName) AS LowerCase,
LEN(CompanyName) AS Length,
REVERSE(CompanyName) AS Reversed,
CHARINDEX(' ', CompanyName) AS FirstSpace,
LEFT(CompanyName, CHARINDEX(' ', CompanyName)) AS FirstWord,
SUBSTRING(CompanyName, CHARINDEX(' ', CompanyName) + 1, LEN(CompanyName)) AS RestOfName
FROM Sales.Customer;
Partial results:
CompanyName
UpperCase
LowerCase
Length
Reversed
FirstSpace
FirstWord
RestOfName
A Bike Store
A BIKE STORE
a bike store
12
erotS ekiB A
2
A
Bike Store
Progressive Sports
PROGRESSIVE SPORTS
progressive sports
18
stropS evissergorP
12
Progressive
Sports
Advanced Bike Components
ADVANCED BIKE COMPONENTS
advanced bike components
24
stnenopmoC ekiB decnavdA
9
Advanced
Bike Components
...
...
...
...
...
...
...
...
Logical functions
Another category of functions allows determine which of several values is to be returned. Logical functions evaluate an input expression, and return an appropriate value based on the result.
IIF
The IIF function evaluates a Boolean input expression, and returns a specified value if the expression evaluates to True, and an alternative value if the expression evaluates to False.
For example, consider the following query, which evaluates the address type of a customer. If the value is "Main Office", the expression returns "Billing". For all other address type values, the expression returns "Mailing".
SELECT AddressType,
IIF(AddressType = 'Main Office', 'Billing', 'Mailing') AS UseAddressFor
FROM Sales.CustomerAddress;
The partial results from this query might look like this:
AddressType
UseAddressFor
Main Office
Billing
Shipping
Mailing
...
...
CHOOSE
The CHOOSE function evaluates an integer expression, and returns the corresponding value from a list based on its (1-based) ordinal position.
SELECT SalesOrderID, Status,
CHOOSE(Status, 'Ordered', 'Shipped', 'Delivered') AS OrderStatus
FROM Sales.SalesOrderHeader;
The results from this query might look something like this:
SalesOrderID
Status
OrderStatus
1234
3
Delivered
1235
2
Shipped
1236
2
Shipped
1237
1
Ordered
...
...
...