我有一个包含JSON和计划文本的文本列.我想将其转换为JSON,然后 Select 一个特定的属性.例如:

user_data
_________
{"user": {"name": "jim"}}
{"user": {"name": "sally"}}
some random data string

我试过:

select user_data::json#>'{user,name}' from users

我得到:

ERROR:  invalid input syntax for type json
DETAIL:  Token "some" is invalid.
CONTEXT:  JSON user_data, line 1: some...

有可能防止这种情况吗?

推荐答案

如果要跳过包含无效JSON的行,如果文本是有效JSON,则必须先跳过test行.可以通过创建一个函数来实现这一点,该函数将try 解析该值,并捕获无效JSON值的异常.

CREATE OR REPLACE FUNCTION is_json(input_text varchar) RETURNS boolean AS $$
  DECLARE
    maybe_json json;
  BEGIN
    BEGIN
      maybe_json := input_text;
    EXCEPTION WHEN others THEN
      RETURN FALSE;
    END;

    RETURN TRUE;
  END;
$$ LANGUAGE plpgsql IMMUTABLE;

当你有了它,你可以在CASEWHERE子句中使用is_json函数来缩小有效值的范围.

-- this can eliminate invalid values
SELECT user_data::json #> '{user,name}'
FROM users WHERE is_json(user_data);

-- or this if you want to fill will NULLs
SELECT
  CASE
    WHEN is_json(user_data)
      THEN user_data::json #> '{user,name}'
    ELSE
      NULL
  END
FROM users;

Postgresql相关问答推荐

从子查询中的排序结果中获取前X行

在PostgreSQL中是否有与SQLite R*Tree类似功能?

为什么Postgres优化器切换到嵌套循环进行连接?

是否可以在psql查询输出中删除新行末尾的+号?

docker-compose.yml用于使用postgres的spring-boot应用程序

IF 块中的 CREATE FUNCTION 语句抛出错误,同时运行它自己的作品

使用正则表达式计算 SQL 查询中 WHERE 过滤器的数量

postgres 如何计算多列哈希?

Postgis 不只使用索引扫描

在 PostgreSQL 中返回插入的行

LAG 函数和 GROUP BY

如何在 PostgreSQL 触发器函数中获取表名?

postgresql:致命:password authentication failed for user "douglas"

如何使用 Node.js 和 Postgresql 找到最后一个插入 ID?

从长时间的postgres转换日期

向 Postgres 整数数组添加值

PostgreSQL 表变量

Oracle 相当于 Postgres 的 DISTINCT ON?

如何在postgresql中编写关于最大行数的约束?

PostgreSQL 字符串(255) 限制 - Rails、Ruby 和 Heroku