DOMAIN_ORDER
Purpose
DOMAIN_ORDER
returns expr formatted according to the domain's order expression. This returns NULL
if the arguments are not associated with a domain or the domain has no order expression.
When calling DOMAIN_ORDER
for multicolumn domains, all values of expr
should be from the same domain. It returns NULL
if the number expr arguments are different from the number of domain columns or they are in a different order in the domain.
To get the display expression for a non-domain value, cast expr
to the domain type. This is only possible for single column domains.
See Also:
Examples
The following example creates the domain DAY_OF_WEEK
and associates it with the column CALENDAR_DATES.DAY_OF_WEEK_ABBR
. Passing this column to DOMAIN_ORDER
returns the result of the ORDER
expression (MON = 0
, TUE = 1
, etc.). Using this in the ORDER BY
returns the rows sorted by their position in the week instead of alphabetically.
The query casts the string "MON"
to DAY_OF_WEEK
to get its sort value.
All other calls to DOMAIN_ORDER
pass non-domain values, so return NULL
.
CREATE DOMAIN day_of_week AS CHAR(3 CHAR) ORDER CASE UPPER(day_of_week) WHEN 'MON' THEN 0 WHEN 'TUE' THEN 1 WHEN 'WED' THEN 2 WHEN 'THU' THEN 3 WHEN 'FRI' THEN 4 WHEN 'SAT' THEN 5 WHEN 'SUN' THEN 6 ELSE 7 END;
CREATE TABLE calendar_dates ( calendar_date DATE, day_of_week_abbr day_of_week );
INSERT INTO calendar_dates VALUES(DATE'2023-05-01', 'MON'), (DATE'2023-05-02', 'TUE'), (DATE'2023-05-05', 'FRI'), (DATE'2023-05-08', 'mon');
SELECT day_of_week_abbr, DOMAIN_ORDER(day_of_week_abbr) domain_column, DOMAIN_ORDER(calendar_date) nondomain_column, DOMAIN_ORDER(CAST('MON' AS day_of_week)) domain_value, DOMAIN_ORDER('MON') nondomain_value FROM calendar_dates ORDER BY DOMAIN_ORDER(day_of_week_abbr); DAY_OF_WEEK_ABBR DOMAIN_COLUMN NONDOMAIN_COLUMN DOMAIN_VALUE NONDOMAIN_VALUE ---------------- ------------- ---------------- ------------ --------------- MON 0 <null> 0 <null> mon 0 <null> 0 <null> TUE 1 <null> 0 <null> FRI 4 <null> 0 <null>
The following example creates the multicolumn domain CURRENCY
with an order expression. This sorts the values by currency then value. The columns AMOUNT
and CURRENCY_CODE
in ORDER_ITEMS
are associated with this domain.
In the query, only the domain_cols expression formats the columns according to the order expression. All other calls to DOMAIN_ORDER
have a mismatch between its arguments and the domain columns so return NULL
:
CREATE DOMAIN currency AS ( amount AS NUMBER(10, 2) currency_code AS CHAR(3 CHAR) ) ORDER currency_code || TO_CHAR(amount, '999999999.00');
CREATE TABLE order_items ( order_id INTEGER, product_id INTEGER, amount NUMBER(10, 2), currency_code CHAR(3 CHAR), DOMAIN currency(amount, currency_code) );
INSERT INTO order_items VALUES (1, 1, 9.99, 'USD'), (2, 2, 1234.56, 'USD'), (3, 3, 4321, 'EUR'), (4, 4, 3141592, 'JPY'), (5, 5, 2718281, 'JPY');
SELECT order_id, product_id, DOMAIN_ORDER(amount, currency_code) domain_cols, DOMAIN_ORDER(currency_code, amount) domain_cols_wrong_order, DOMAIN_ORDER(order_id, product_id) nondomain_cols, DOMAIN_ORDER(amount) domain_cols_subset FROM order_items ORDER BY domain_cols; ORDER_ID PRODUCT_ID DOMAIN_COLS DOMAIN_COLS_WRONG_ORDER NONDOMAIN_COLS DOMAIN_COLS_SUBSET ---------- ---------- ---------------- ----------------------- -------------- ------------------ 3 3 EUR 4321.00 <null> <null> <null> 5 5 JPY 2718281.00 <null> <null> <null> 4 4 JPY 3141592.00 <null> <null> <null> 1 1 USD 9.99 <null> <null> <null> 2 2 USD 1234.56 <null> <null> <null>