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,有没有办法:
SQLFiddle:http://sqlfiddle.com/#!12/54823
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)
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)
所以我遇到了文本是 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)
如果您需要索引,请创建一个不可变函数,该函数将 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)
| 归档时间: |
|
| 查看次数: |
46680 次 |
| 最近记录: |