Wartość Json może składać się z wartości ciągu. na przykład.:
postgres=# SELECT to_json('Some "text"'::TEXT);
to_json
-----------------
"Some \"text\""
Jak mogę wyodrębnić ten ciąg jako wartość tekstową postgres?
::TEXT
nie działa. Zwraca json w cudzysłowie, a nie oryginalny ciąg:
postgres=# SELECT to_json('Some "text"'::TEXT)::TEXT;
to_json
-----------------
"Some \"text\""
Dzięki.
PS Używam PostgreSQL 9.3
json
postgresql
e79ene
źródło
źródło
Odpowiedzi:
W PostgreSQL nie ma sposobu na dekonstrukcję skalarnego obiektu JSON. Tak więc, jak wskazałeś,
select length(to_json('Some "text"'::TEXT) ::TEXT);
15 lat,
Sztuczka polega na przekonwertowaniu JSON na tablicę jednego elementu JSON, a następnie wyodrębnieniu tego elementu za pomocą
->>
.select length( array_to_json(array[to_json('Some "text"'::TEXT)])->>0 );
zwróci 11.
źródło
json_extract_path_text()
nie może odwoływać się do elementu głównego (AFAIK).from_json
dostałem proponowanych, ale nie realizowane wiki.postgresql.org/wiki/JSON_API_BrainstormW 9.4.4 korzystanie z
#>>
operatora działa dla mnie:select to_json('test'::text) #>> '{}';
Aby użyć z kolumną tabeli:
select jsoncol #>> '{}' from mytable;
źródło
to_json(...)
jest to po prostu łatwy sposób na utworzenie wartości JSON do pracy jako przykład w krótkiej jednowierszowej instrukcji. Z pewnością zastąpiłbyś ją nazwą kolumny JSON, gdybyś odpytywał tabelę zgodnie z opisem. Ponadto, aby wyjaśnić potencjalny błąd, rzutowanie(...)::text
jest zbędne, ponieważ#>>
operator z definicji zwraca tekst (i jest powodem używania operatora w pierwszej kolejności). Możesz zachować nawiasy, ale porzucić obsadę::text
.#>>
i'{}'
robi? Nie do końca rozumiem, a żaden termin nie jest przyjazny dla Google. Ta odpowiedź rozwiązała mój problem, chcę tylko wiedzieć, dlaczego.#>>
operatora jest tutaj .text
. Może wyglądać jak ciąg znaków, ale jest to obiekt JSON. Aby przekonwertować ten obiekt z formatu JSON na tekst, użyj#>>
operatora. Ale ten operator wymaga, abyś określił ścieżkę. Ścieżka do tego obiektu głównego to{}
. WięcSELECT '"test"'::jsonb #>> '{}'
oznacza „uzyskać obiekt na ścieżce root i przekonwertować go do tekstu”.Pan Ciekawski też był tego zaciekawiony. Oprócz
#>> '{}'
operatora, w 9.6+ można uzyskać wartość łańcucha jsonb za pomocą->>
operatora:select to_jsonb('Some "text"'::TEXT)->>0; ?column? ------------- Some "text" (1 row)
Jeśli ktoś ma wartość json, rozwiązaniem jest najpierw rzutowanie na jsonb:
select to_json('Some "text"'::TEXT)::jsonb->>0; ?column? ------------- Some "text" (1 row)
źródło
Prosty sposób na zrobienie tego:
SELECT ('[' || to_json('Some "text"'::TEXT) || ']')::json ->> 0;
Po prostu przekonwertuj ciąg json na listę json
źródło
- >> działa na mnie.
wersja postgres:
Pytanie:
select object_details->'valuationDate' as asofJson, object_details->>'valuationDate' as asofText from MyJsonbTable;
Wynik:
źródło
->
i->>
podczas korzystania z klucza. Zobacz tę odpowiedź lub tę odpowiedź .