DOMAIN_ORDER
目的
DOMAIN_ORDER
は、ドメインの順序式に従って書式設定されたexprを戻します。引数がドメインに関連付けられていないか、ドメインに順序式がない場合、NULL
が戻されます。
複数列ドメインに対してDOMAIN_ORDER
をコールする場合、expr
のすべての値が同じドメインのものである必要があります。exprの引数の数がドメイン列の数と異なる場合、またはドメイン内の順序が異なる場合、NULL
を戻します。
非ドメイン値の表示式を取得するには、expr
をドメイン・タイプにキャストします。これは、単一列のドメインでのみ可能です。
関連項目:
例
次の例では、ドメインDAY_OF_WEEK
を作成し、それを列CALENDAR_DATES.DAY_OF_WEEK_ABBR
に関連付けます。この列をDOMAIN_ORDER
に渡すと、ORDER
式(MON = 0
、TUE = 1
など)の結果が戻されます。ORDER BY
でこれを使用すると、行をアルファベット順ではなく週内の位置でソートして戻します。
問合せは、文字列"MON"
をDAY_OF_WEEK
にキャストして、ソート値を取得します。
DOMAIN_ORDER
への他のすべてのコールは非ドメイン値を渡すため、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>
次の例では、順序式を使用して複数列ドメインCURRENCY
を作成します。通貨、値の順にソートされます。ORDER_ITEMS
の列AMOUNT
およびCURRENCY_CODE
がこのドメインに関連付けられています。
問合せでは、domain_cols式のみが順序式に従って列を書式設定します。DOMAIN_ORDER
に対する他のすべてのコールの引数とドメイン列が一致しないため、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>