web-dev-qa-db-ja.com

PostgreSQL 9.2-TEXT json文字列をjson / hstore型に変換します

有効なJSON文字列を含むTEXT列があります。

CREATE TABLE users(settings TEXT);

INSERT INTO users VALUES ('{"language":"en","gender":"male"}');
INSERT INTO users VALUES ('{"language":"fr","gender":"female"}');
INSERT INTO users VALUES ('{"language":"es","gender":"female"}');
INSERT INTO users VALUES ('{"language":"en","gender":"male"}');

一部のフィールドをクエリ可能な形式に変換したい。

REGEXP_REPLACE各フィールドに対して(languageフィールドとgenderフィールド)を実行します。ただし、有効なJSONなので、次の方法があります。

  • JSON型に変換する
  • Hstore型に変換する
  • または他の実行可能な方法

SQLFiddle: http://sqlfiddle.com/#!12/5482

28
huy
SELECT cast(settings AS json) from users;
36
Reza S

または、Rezaよりも最短の方法で:

SELECT settings::json FROM users;

次に、たとえば言語を選択するには:

SELECT settings::json->>'language' FROM users;

公式ドキュメント の詳細。

24

Postgresql:TEXTカラムをJSONに変換する からのソリューションを次に示します。

ALTER TABLE table1 ALTER COLUMN col1 TYPE JSON USING col1::JSON;
16
Hua Zhang

インデックスが必要な場合は、jsonを入力として受け取り、pl言語の出力として必要なフィールドを生成する不変の関数を作成します。

create function extract_language(text) returns text as $$
  -- parse $1 as json
  -- return $1.language
$$ language whatever immutable;

次に、式にインデックスを追加します。

create index users_language on users(extract_language(settings));

インデックスは、(潜在的に)次のようなクエリで使用されます。

select * from users where extract_language(settings) = 'en';
3

そのため、テキストがJSONであるという問題がありました。この問題がある場合は、代わりにこのクエリを使用してください。ここで、COLUMNはJSONBまたはJSONデータ型を含む列であり、ATTRIBUTEはJSONに変換する文字列であるJSONの属性です。

テキストは次のようになります。「{\ "junk5 \":283774663、\ "junk2 \":0、\ "junk1 \":1218478497、\ "junk3 \":1923、\ "junk4 \":63278342} "

SELECT CAST(TRIM(both '"' from jsonstring) as JSON)
FROM (
    SELECT REPLACE(cast(COLUMN->'ATTRIBUTE' as text), '\"', '"')
    as jsonString from TABLE where cast(COLUMN->'ATTRIBUTE' as text)LIKE '%\\%'
) as JSON_CONVERTING
0
Jackstine