An example of casting between named row types

Suppose you create the named row types and table shown in the next example. Although the named row types are structurally equivalent, writer_t and editor_t are unique data types.
CREATE ROW TYPE writer_t (name VARCHAR(30), depart CHAR(3));
CREATE ROW TYPE editor_t (name VARCHAR(30), depart CHAR(3));

CREATE TABLE projects
(
   book_title  VARCHAR(20),
   writer      writer_t,
   editor      editor_t
);
To handle conversions between two named row types, you must first create a user-defined cast. The following example creates a casting function and registers it as a cast to handle conversions from type writer_t to editor_t:
CREATE FUNCTION cast_rt (w writer_t)
   RETURNS editor_t
   RETURN (ROW(w.name, w.depart)::editor_t); 
END FUNCTION;

CREATE CAST (writer_t as editor_t WITH cast_rt);
After you create and register the cast, you can explicitly cast values of type writer_t to editor_t. The following query uses an explicit cast in the WHERE clause to convert values of type writer_t to editor_t:
SELECT book_title FROM projects
   WHERE CAST(writer AS editor_t) = editor;
If you prefer, you can use the :: cast operator to perform the same cast, as the following example shows:
SELECT book_title FROM projects
   WHERE writer::editor_t = editor;