有効な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なので、次の方法があります。
SQLFiddle: http://sqlfiddle.com/#!12/5482
SELECT cast(settings AS json) from users;
または、Rezaよりも最短の方法で:
SELECT settings::json FROM users;
次に、たとえば言語を選択するには:
SELECT settings::json->>'language' FROM users;
公式ドキュメント の詳細。
Postgresql:TEXTカラムをJSONに変換する からのソリューションを次に示します。
ALTER TABLE table1 ALTER COLUMN col1 TYPE JSON USING col1::JSON;
インデックスが必要な場合は、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';
そのため、テキストが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