On 7/25/25 05:26, Mark wrote:
Hi all
Apologies for any unexpected protocol exceptions, I do not post to
mailing lists very often
I have been trying to work with JSON objects and noticed I could not get
the function json_to_record to produce results, unless I had the key
values in lower case, through testing what works.
I completed a search, but could not find any pointer (except for some
front end comments on labels being all upper or all lower case)
Could anybody comment if the postgres standard is to have key labels in
lower case?
Yes and no. It comes down to this:
https://www.postgresql.org/docs/current/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS
"Quoting an identifier also makes it case-sensitive, whereas unquoted
names are always folded to lower case. For example, the identifiers FOO,
foo, and "foo" are considered the same by PostgreSQL, but "Foo" and
"FOO" are different from these three and each other. (The folding of
unquoted names to lower case in PostgreSQL is incompatible with the SQL
standard, which says that unquoted names should be folded to upper case.
Thus, foo should be equivalent to "FOO" not "foo" according to the
standard. If you want to write portable applications you are advised to
always quote a particular name or never quote it.)"
So on the Postgres(SQL) side 'as x(seclvl int, firbal text, firlvl text
, thilvl text, fourlvl int)' if you want to match the mixed case keys
coming from the JSON object you need to double quote the field names.
The yes is that Postgres by default folds identifiers to lower case, but
no that does not mean you have to use lower case by default for the JSON
keys.
Many thanks for any help you can provide
Mark
query:
select * from json_to_record('{"secLvl": 13, "firBal": "somethi",
"firLvl": "C", "thiLvl": "A", "fourLvl": 2}'::json) as x(seclvl int,
firbal text, firlvl text
, thilvl text, fourlvl int);
result:
seclvl | firbal | firlvl | thilvl | fourlvl
--------+--------+--------+--------+---------
| | | |
(1 row)
query:
select * from json_to_record('{"seclvl": 13, "firbal": "somethi",
"firlvl": "C", "thilvl": "A", "fourlvl": 2}'::json) as x(seclvl int,
firbal text, firlvl text
, thilvl text, fourlvl int);
result:
seclvl | firbal | firlvl | thilvl | fourlvl
--------+---------+--------+--------+---------
13 | somethi | C | A | 2
(1 row)
--
Adrian Klaver
adrian.kla...@aklaver.com