Thread: Do you know a json_populate_record alternative method to create a ROW with a named field notation?

Hello,

In this example:

```
CREATE TYPE contact AS (
   firstname VARCHAR,
   lastname VARCHAR
);

postgres=# SELECT json_populate_record(NULL::contact,
postgres(#   '{
postgres'#      "firstname": "John",
postgres'#      "lastname": "Doe"
postgres'#    }'
postgres'# );
 json_populate_record
----------------------
 (John,Doe)
(1 row)
```

**Question:** do you know a method like json_populate_record (https://www.postgresql.org/docs/13/functions-json.html), which allows creating a `ROW` with named field notation without using a json format?

I know the `ROW` syntax expression:

```
postgres=# SELECT ROW('John', 'Doe')::contact;
    row
------------
 (John,Doe)
(1 row)
```

But I didn't find a `ROW` constructors (https://www.postgresql.org/docs/13/sql-expressions.html#SQL-SYNTAX-ROW-CONSTRUCTORS) syntax allowing a named field notation.

Best regards,  
Stéphane
--
=?UTF-8?Q?St=C3=A9phane_Klein?= <contact@stephane-klein.info> writes:
> **Question:** do you know a method like json_populate_record (
> https://www.postgresql.org/docs/13/functions-json.html), which allows
> creating a `ROW` with named field notation without using a json format?

You mean you want to give the field names explicitly in the expression?

The closest thing I can think of is to make a constructor function and
invoke it with named-argument notation:

regression=# CREATE TYPE contact AS (
regression(#    firstname VARCHAR,
regression(#    lastname VARCHAR
regression(# );
CREATE TYPE
regression=# create function make_contact(firstname varchar, lastname varchar)
regression-# returns contact as 'select row(firstname, lastname)::contact'
regression-# language sql;
CREATE FUNCTION
regression=# select make_contact(firstname => 'John', lastname => 'Doe');
 make_contact 
--------------
 (John,Doe)
(1 row)

A bit tedious to set up, but it would have some advantages, eg you
could provide default values.

            regards, tom lane