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 = 0TUE = 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>