PostgreSQL 9.3+下的JSON,这么难看?

标签 json postgresql

是否有一种“不那么丑陋”的选项可以将字符串作为 text 并将整数作为 int

JSON 树的所有叶子都有众所周知的数据类型,那么,如何告诉 PostgreSQL 查看数据类型?


问题的例子和丑陋的解决方案...有更少丑陋的解决方案吗?

SELECT version(); -- PostgreSQL 9.3

CREATE TABLE example (
  id serial PRIMARY KEY,
  info JSON 
);
INSERT INTO example (info) VALUES
  ('{"aa":10,"bb":"nonono nononon"}'),
  ('{"aa":10,"x":"etc"}'),  
  ('{"aa":9,"x":"etc etc"}');

-- SIX ERROS... But human-readable syntax
SELECT DISTINCT info->'aa' FROM example;    -- ex.1
SELECT * FROM example ORDER BY info->'aa';  -- ex.2
SELECT info->'x' FROM example WHERE info->'x' IS NOT NULL; -- ex.3
SELECT * FROM example WHERE info->'x'='etc';  -- ex.4
SELECT * FROM example WHERE (info->'x')::text='etc';  -- ex.5
SELECT * FROM example WHERE info->'aa'=10;  -- ex.6

-- UGLY (!!) six workarounds
SELECT DISTINCT (info->'aa')::text FROM example;        -- ex.1
SELECT * FROM example ORDER BY (info->'aa')::text::int; -- ex.2
SELECT info->'x' FROM example WHERE (info->'x')::text IS NOT NULL; -- ex.3
SELECT * FROM example WHERE trim((info->'x')::text,'"')='etc';  -- exs. 4 and 5
SELECT * FROM example WHERE (info->'aa')::text::int=10;  -- ex.6

最佳答案

使用->> json operator ,它返回一个 JSON 对象字段或一个 JSON 数组作为 text

SELECT DISTINCT info->>'aa' FROM example;
SELECT * FROM example ORDER BY info->>'aa';
SELECT info->>'x' FROM example WHERE (info->>'x') IS NOT NULL;
SELECT * FROM example WHERE info->>'x'='etc';
SELECT * FROM example WHERE (info->>'aa')::int=10;  -- still needs a cast to int

关于PostgreSQL 9.3+下的JSON,这么难看?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33986980/

相关文章:

javascript - Rest 服务文档中的 Json 数据的键中包含斜线

postgresql - 具有嵌套 IF 的 Postgres 函数

PostgreSQL 跟踪表中的投票?

json - 如何读取在node.js中作为命令行参数传递的json字符串?

ios - 在 iOS 上解析 json 数组

json - 输出多行 bash 变量以 curl json

javascript - 从 JSON.stringify() 获取值

django - GeoDjango 中新 GeometryField 的通用输入元素

sql - 使用 OVER 子句和 PARTITION BY 子句与计数器计算运行总和

postgresql - 为什么我的Flask服务器无法使用docker-compose与postgres数据库对话?