Strange SQL result - any ideas.

From: Paul Linehan <linehanp(at)tcd(dot)ie>
To:
Cc: pgsql-general(at)postgresql(dot)org
Subject: Strange SQL result - any ideas.
Date: 2017-09-01 22:08:32
Message-ID: CAF4RT5TnnNXLZJt=-fCH_uwSB_VYSBAni6RucPxwrzjQrxmvsg@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

<CREATE TABLE and INSERT INTO statements at end of post>

I have a table (fred) that I want to transform into JSON and
I use the following command (ignore the backslash stuff):

SELECT REGEXP_REPLACE(ROW_TO_JSON(t)::TEXT, '\\\\', '\\', 'g')
FROM
(
SELECT * FROM fred
ORDER BY mary, jimmy, paulie
) AS t;

which gives

regexp_replace
------------------------------------------------------
{"mary":2,"jimmy":43,"paulie":"asfasfasfd"}
{"mary":3,"jimmy":435,"paulie":"ererere"}
{"mary":3,"jimmy":44545,"paulie":"\sdfs\\\sfs\\gf"}
{"mary":6,"jimmy":43343,"paulie":"eresdfssfsfasfae"}
{"mary":35,"jimmy":5,"paulie":"wrew\sdfsd"}
(5 rows)

which is fine (note that the field "mary" is sorted correctly) but
I want "proper" JSON - i.e. with open and close square brackets
i.e. ([ - ]) before and after the fields!

So, I tried this query:

SELECT '[' AS my_data -- <<-- added line
UNION -- <<-- added line
SELECT REGEXP_REPLACE(ROW_TO_JSON(t)::TEXT, '\\\\', '\\', 'g')
FROM
(
SELECT * FROM fred
ORDER BY mary, jimmy, paulie
) AS t
UNION -- <<-- added line
SELECT ']'; -- <<-- added line

*_BUT_*, this gives

my_data
------------------------------------------------------
]
[
{"mary":6,"jimmy":43343,"paulie":"eresdfssfsfasfae"}
{"mary":35,"jimmy":5,"paulie":"wrew\sdfsd"}
{"mary":3,"jimmy":44545,"paulie":"\sdfs\\\sfs\\gf"}
{"mary":2,"jimmy":43,"paulie":"asfasfasfd"}
{"mary":3,"jimmy":435,"paulie":"ererere"}
(7 rows)

Two problems with this result - one is that my square brackets are not in
the right place - this at least I understand - the first character of
each line is sorted by its ASCII value - '[' comes before ']' (naturally)
and '{' comes after them both - or have I got that right?

But, I do *_not_* understand why my table data is now out
of sort order - I've looked at it and can't see *_how_* the sort
order in my table data has been determined.

Anybody got any logical explanations as to what's going on?

TIA & Rgs,

Paul...

-- CREATE TABLE and INSERT INTO statements.

CREATE TABLE fred (
mary integer PRIMARY KEY,
jimmy integer,
paulie character varying(20)
);

INSERT INTO fred (mary, jimmy, paulie) VALUES (2, 43, 'asfasfasfd');
INSERT INTO fred (mary, jimmy, paulie) VALUES (3, 435, 'ererere');
INSERT INTO fred (mary, jimmy, paulie) VALUES (6, 43343, 'eresdfssfsfasfae');
INSERT INTO fred (mary, jimmy, paulie) VALUES (35, 5, 'wrew\sdfsd');
INSERT INTO fred (mary, jimmy, paulie) VALUES (3, 44545, '\sdfs\\\sfs\\gf');

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Tom Lane 2017-09-01 23:01:42 Re: Strange SQL result - any ideas.
Previous Message Ken Tanzer 2017-09-01 21:25:35 Fields re-ordered on JOIN with * and USING