PostgreSQL 9.2 - 将TEXT json字符串转换为json/hstore类型

huy*_*huy 29 postgresql postgresql-9.2

我有一个TEXT包含有效JSON字符串的列.

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"}');
Run Code Online (Sandbox Code Playgroud)

我想将一些字段转换为可查询的格式.

REGEXP_REPLACE每个字段的A 都可以(language字段和gender字段).但由于它是有效的JSON,有没有办法:

  • 转换为JSON类型
  • 转换为hstore类型
  • 或任何其他可行的方式

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

Rez*_*a S 37

SELECT cast(settings AS json) from users;
Run Code Online (Sandbox Code Playgroud)


Pio*_*pla 29

如果您的列已经是 json 并且在根级别包含字符串,则该列::jsonb将不起作用。下面是一个将此类字符串转换为 JSON 的代码:

SELECT (settings #>> '{}')::jsonb -> 'language' from users;
Run Code Online (Sandbox Code Playgroud)

我在这里找到了这个答案

#>>该语句首先通过给定空路径的运算符将根级别字符串提取为文本。请注意,简单地将此类字符串转换为文本 ( ::text) 是行不通的,因为它会转义所有引号。接下来,将提取的字符串解析为 json 对象 ( ::jsonb)。

此查询的另一个版本是将 json 字符串放入数组中,然后将其第一个元素提取为文本:

选择cast(json_build_array(设置)->>0作为json)

要解决此问题,您还可以使用以下命令将根级别带有字符串的所有字段转换为 json:

UPDATE users
SET
    settings = settings #>>'{}'::jsonb
WHERE settings ->> 'language' is  NULL
Run Code Online (Sandbox Code Playgroud)

  • 极好的。这正是我所需要的。能够成为您对这个答案的第一个赞成票,我感到非常自豪和谦卑。:-) 继续做好你的工作,先生。 (4认同)
  • 谢谢奇尔斯的客气话!你让我今天一整天都感觉很好 :)。 (2认同)

Jon*_*las 26

或者以比Reza最短的方式:

SELECT settings::json FROM users;
Run Code Online (Sandbox Code Playgroud)

然后,为了选择语言,例如:

SELECT settings::json->>'language' FROM users;
Run Code Online (Sandbox Code Playgroud)

有关官方文档的更多详细信息.


Hua*_*ang 16

这是Postgresql的一个解决方案:将TEXT列转换为JSON:

ALTER TABLE table1 ALTER COLUMN col1 TYPE JSON USING col1::JSON;
Run Code Online (Sandbox Code Playgroud)


Jac*_*ine 9

所以我遇到了文本是 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
Run Code Online (Sandbox Code Playgroud)

  • 这是我的单行:`update users set settings = regexp_replace(trim(both '"' from settings), '\\"', '"', 'g')::json;` (2认同)

Den*_*rdy 4

如果您需要索引,请创建一个不可变函数,该函数将 json 作为输入,并以 pl 语言生成您想要作为输出的字段,例如:

create function extract_language(text) returns text as $$
  -- parse $1 as json
  -- return $1.language
$$ language whatever immutable;
Run Code Online (Sandbox Code Playgroud)

然后在表达式上添加索引:

create index users_language on users(extract_language(settings));
Run Code Online (Sandbox Code Playgroud)

然后,该索引将(可能)用于以下查询:

select * from users where extract_language(settings) = 'en';
Run Code Online (Sandbox Code Playgroud)