## Predicates

A predicate is a single conditional expression which evaluates to either true, false or unknown. Predicates are used in constructing search conditions, see Search Conditions.

## Predicate Syntax

The general predicate syntax is shown below:

Each individual predicate construction is explained in more detail in the following sections.

## The Basic Predicate

A basic predicate compares a value with one and only one other value, and has the syntax:

The comparison operators,

`comp-operator`

, are described in Comparison Operators.The expressions on either side of the comparison operator must have compatible data types, see Comparisons.

Within the context of a basic predicate, a

`select-expression`

must result in either an empty set or a single value.The result of the predicate is unknown if either of the expressions used evaluates to null, or if the

`select-expression`

used results in an empty result set.A comparison involving row expressions requires that the two row expressions have the same number of elements, and that each element in the first row expression is comparable with the corresponding element in the second row expression.

The comparison will be done from left to right and will continue until all elements have been compared or the predicate is false.

As an example, consider this predicate

(a1,a2,a3) < (b1,b2,b3)a1 < b1 or (a1 <= b1 and a2 < b2) or (a1 <= b1 and a2 <= b2 and a3 < b3)(1,date '1956-04-23', false) < (1,date '1956-04-23', true)would evaluate to TRUE since false is less than true.

Null values are handled analogously with comparisons with single values. Thus

(1,cast(null as int)) < (1,2)(1,cast(null as int)) < (2,2)would become true since the second elements are never compared in this case.

## Row-expression examples

select * from tabA where (c1, c2) = (select k1, k2 from tabB fetch 1); select * from tabA where (abs(c1), c2) > (c3, lower(c4));## The Quantified Predicate

A quantified predicate compares an expression with a set of values addressed by a subselect (as opposed to a basic predicate which compares two single-valued expressions).

The form of the quantified expression is:

The comparison operators,

`comp-operator`

, are described in Comparison Operators.Within the context of a quantified predicate, a

`select-expression`

must result in either an empty set or a set of single values.## ALL

The result is true if the select-specification results in an empty set or if the comparison is true for every value returned by the

`select-expression`

.The result is false if the comparison is false for at least one value returned by the

`select-expression`

.The result is unknown if any of the values returned by the

`select-expression`

is null and no value is false.## ANY or SOME

The keywords

`ANY`

and`SOME`

are equivalent.The result is true if the comparison is true for at least one value returned by the

`select-expression`

.The result is false if the select results in an empty set or if the comparison is false for every value returned by the

`select-expression`

.The result is unknown if any of the values returned by the select is null and no value is true.

Quantified predicates may always be replaced by alternative formulations using

`EXISTS`

, which can often clarify the meaning of the predicates.## The IN Predicate

The

`IN`

predicate tests whether a value is contained in a set of discrete values and has the form:If the set of values on the right hand side of the comparison is given as an explicit list, an

`IN`

predicate may always be expressed in terms of a series of basic predicates linked by one of the logical operators`AND`

or`OR`

:

## IN predicate

## Equivalent basic predicates

x IN (a,b,c) x = a OR x = b OR x = c x NOT IN (a,b,c) x <> a AND x <> b AND x <> cIf the set of values is given as a

`select-expression`

, an`IN`

predicate is equivalent to a quantified predicate:

## IN predicate

## Equivalent quantified predicates

x IN (subselect) x = ANY (subselect) x NOT IN (subselect) x <> ALL (subselect)The result of the

`IN`

predicate is unknown if the equivalent predicates give an unknown result.## Note: NOT IN is undefined if the subselect's result contains a null value. E.g. SELECT * FROM tab WHERE 1 NOT IN (3, <null>, 4) will return an empty result set.

## The BETWEEN Predicate

A

`BETWEEN`

predicate tests whether or not a value is within a range of values (including the given limits).The

`BETWEEN`

predicate can always be expressed in terms of basic predicates.If neither

`SYMMETRIC`

nor`ASYMMETRIC`

is specified, then`ASYMMETRIC`

is implicit.## Examples

All expressions in the predicate must have compatible data types.

The result of the predicate is unknown if the equivalent basic predicates give an unknown result.

## The LIKE Predicate

The

`LIKE`

predicate compares the value in a string expression with a character string pattern which may contain wildcard characters (meta-characters).The

`string-value`

on the left hand side of the`LIKE`

operator must be a string expression.The

`character-pattern`

on the right hand side of the`LIKE`

operator is a string expression.The escape

`character-value`

must be a string expression of length 1. To search for the escape character itself it must appear twice in immediate succession in the like pattern.## Meta-characters/Wildcards

The following meta-characters (wildcards) may be used in the

`character-pattern`

:

`_`

stands for any single character

`%`

stands for any sequence of zero or more characters.## Note: Wildcard characters are only used as such in LIKE predicates. In any other context, the characters _ and % have their exact values.

## Escape Characters

The optional escape character is used to allow matching of the special characters

`_`

and`%`

. When the escape character prefixes`_`

and`%`

, they are interpreted without any special meaning.An escape character used in a pattern string may only be followed by another escape character or one of the wildcard characters, unless it is itself escaped (i.e. preceded by an escape character).

## Examples

A

`LIKE`

predicate where the pattern string does not contain any wildcard characters is essentially equivalent to a basic predicate using the`=`

operator.The comparison strings in the

`LIKE`

predicate are not conceptually padded with blanks, in contrast to the basic comparison.

`'artist ' LIKE 'artist '`

is true

`'artist ' LIKE 'artist%'`

is true

`'artist ' LIKE 'artist'`

is false## Begins With

`LIKE`

predicates, addressing the "begins with" functionality, are very common.However, when a parameter marker is used for the LIKE pattern, the SQL compiler can not determine the LIKE pattern characteristics, and possible optimizations will not be applied. The built-in function

`BEGINS`

will overcome this issue. See BEGINS for information.## Regular Expressions

Compared to

`LIKE`

, the regular expression provides a much more flexible way to match strings of text, such as complex patterns of characters.Use the

`REGEXP_MATCH`

function to do regular expression searches. See REGEXP_MATCH for information.## The NULL Predicate

The

`NULL`

predicate is used to test if the specified expression is the null value, and has the form:The result of the

`NULL`

predicate is never unknown.## Evaluation rules for the NULL predicate:

The use of composite expressions in

`NULL`

predicates provides a shorthand for testing whether any of the operands is null.Thus the predicate

`A=B IS NULL`

is an alternative to`A IS NULL OR B IS NULL`

.## Note: The actual operator(s) used in expressions in NULL predicates is irrelevant since all operations involving a null value evaluate to the null value.

The

`NULL`

predicate is the only way to test for the presence of the null value in a column, since all other predicates where at least one of the operands is null evaluate to unknown.## The EXISTS Predicate

The

`EXISTS`

predicate tests whether the set of values addressed by a`select-specification`

is empty or not, and has the form:The result of the

`EXISTS`

predicate is true if the`select-expression`

does not result in an empty set. Otherwise the result of the predicate is false. A set containing only null values is not empty. The result is never unknown.The

`EXISTS`

predicate is the only predicate which does not compare a value with one or more other values. The columns selected in the`select-expression`

of an`EXISTS`

predicate are irrelevant. Most commonly, the`SELECT *`

shorthand is used.The

`EXISTS`

predicate may be negated in the construction of search conditions.## Examples

Consider the four following examples, and note particularly that the last example is true if all guests have undefined names:

## Example 1

EXISTS (SELECT * FROM BOOK_GUEST WHERE GUEST = 'DATE')## Example 2

NOT EXISTS (SELECT * FROM BOOK_GUEST WHERE GUEST = 'DATE')## Example 3

EXISTS (SELECT * FROM BOOK_GUEST WHERE NOT GUEST = 'DATE')## Example 4

NOT EXISTS (SELECT * FROM BOOK_GUEST WHERE NOT GUEST = 'DATE')requires that no guest may not be called DATE, i.e. every guest must be called DATE (or be null).

## The OVERLAPS Predicate

The

`OVERLAPS`

predicate tests whether two `events' cover a common point in time or not, and has the form:Each of the two events specified on either side of the

`OVERLAPS`

keyword is a period of time between two specified points on the time-line. The two points can be specified as a pair of datetime values or as one datetime value and an`INTERVAL`

offset.The first column in each row value expression must be a

`DATE`

,`TIME`

or`TIMESTAMP`

and the value in the first column of the first event must be comparable, see Datetime Assignment Rules, to the value in the first column of the second event.The second column in each row value expression may be either a

`DATE`

,`TIME`

or`TIMESTAMP`

that is comparable with the value in the first column or an`INTERVAL`

with a precision that allows it to be added to the value in the first column.The value in the first column of each row value expression defines one of the points on the time-line for the event.

If the value in the second column of the row value expression is a datetime, it defines the other point on the time-line for the event.

If the value in the second column of the row value expression is an

`INTERVAL`

, the other point on the time-line for the event is defined by adding the values in the two column of the row value to expression together.Either of the two points may be the earlier point in time.

If the value in the first column of the row value expression is the null value, then this is assumed to be the later point in time.

The result of

`(S1,T1) OVERLAPS (S2,T2)`

is the result of the following expression:(S1 > S2 AND NOT (S1 >= T2 AND T1 >= T2)) OR (S2 > S1 AND NOT (S2 >= T1 AND T2 >= T1)) OR (S1 = S2 AND (T1 <> T2 OR T1 = T2))## The UNIQUE Predicate

The

`UNIQUE`

predicate tests whether all rows returned by a`select-specification`

are unique or not, and has the form:The result of the

`UNIQUE`

predicate is true if the`select-expression`

does not return any duplicates. Otherwise the result of the predicate is false.The result is never unknown. Null values are not considered equal to any values, including other null values.The

`UNIQUE`

predicate may be negated in the construction of search conditions.## Examples

Return all artists that have only released one item:

SELECT A.* FROM MIMER_STORE.ARTISTS A WHERE UNIQUE (SELECT ARTIST_ID FROM MIMER_STORE_MUSIC.TITLES T WHERE T.ARTIST_ID = A.ARTIST_ID)Return all artists that have released items on different formats:

SELECT A.* FROM MIMER_STORE.ARTISTS A WHERE NOT UNIQUE (SELECT FORMAT FROM MIMER_STORE_MUSIC.DETAILS D WHERE D.ARTIST_ID = A.ARTIST_ID)## The DISTINCT Predicate

The

`DISTINCT`

predicate tests whether two values are distinct from each other or not, and has the form:If both values are null, the result of the

`DISTINCT`

predicate is false. If only one of the values is null, the result of the predicate is true. If none of the values is null, the result of the predicate is true if the values are not the same.## Examples

The following examples are intended to show the difference between distinct from and not equal to when it comes to null values.

## Select currencies that have an exchange rate distinct from Sweden's non-null exchange rate:

SELECT C1.* FROM MIMER_STORE.CURRENCIES C1 JOIN MIMER_STORE.CURRENCIES C2 ON C1.EXCHANGE_RATE IS DISTINCT FROM C2.EXCHANGE_RATE WHERE C2.CODE = 'SEK'The above query will return 161 rows. Countries having a null exchange rate are included.

## Select currencies that have an exchange rate not equal to Sweden's non-null exchange rate:

SELECT COUNT(*) FROM MIMER_STORE.CURRENCIES C1 JOIN MIMER_STORE.CURRENCIES C2 ON C1.EXCHANGE_RATE <> C2.EXCHANGE_RATE WHERE C2.CODE = 'SEK'The above query will return 154 rows. Countries having a null exchange rate are excluded.

## Select currencies that have an exchange rate distinct from Saint Helena's null exchange rate:

SELECT C1.* FROM MIMER_STORE.CURRENCIES C1 JOIN MIMER_STORE.CURRENCIES C2 ON C1.EXCHANGE_RATE IS DISTINCT FROM C2.EXCHANGE_RATE WHERE C2.CODE = 'SHP'The above query will return 151 rows. No countries having a null exchange rate are included.

## Select currencies that have an exchange rate not equal to Saint Helena's null exchange rate:

SELECT COUNT(*) FROM MIMER_STORE.CURRENCIES C1 JOIN MIMER_STORE.CURRENCIES C2 ON C1.EXCHANGE_RATE <> C2.EXCHANGE_RATE WHERE C2.CODE = 'SHP'The above query will return 0 rows.

## Standard Compliance

This section summarizes standard compliance concerning predicates.

Mimer Information Technology AB Voice: +46 18 780 92 00 Fax: +46 18 780 92 40 info@mimer.se |