【问题标题】:How to SELECT json data from postsgreSQL WHERE key="1"?如何从 postgreSQL WHERE key="1" 中选择 json 数据?
【发布时间】:2020-12-15 00:53:29
【问题描述】:

我已将 JSON 数据存储在“数据”列中。 我只想检索键为“1”的那些行。 问题是 None 值也被提取,当我使用 WHERE 子句删除 None 值时,我遇到了错误。

cursor.execute('''SELECT data -> '1' FROM table WHERE data != %s''',(None,)) 
data_list= cursor.fetchall()

我得到的错误-

psycopg2.errors.UndefinedFunction: operator does not exist: json <> unknown 
LINE 1: SELECT data-> '1'  FROM table WHERE  data!= NULL
HINT:  No operator matches the given name and argument types. You might need to add explicit type casts.

数据列是这样的-

[(None,), (None,), (None,), ({'1':{"post":{salary: 100000 , "shift": "first" }}} ,), ({'1':{"post":{salary: 180000 , "shift": "second" }}},), (None,), ({'2':{"post":{salary: 20000 , "shift": "first" }}})] 

我正在使用 python psycopg2 模块。

【问题讨论】:

  • 请提供data 表的表示形式。如果显示您的数据库表的样子,该场景可能更容易理解
  • 添加数据列
  • 您想先将行提取到python,然后过滤您需要的数据吗?而不是尝试直接使用 MySQL 进行过滤
  • 我想直接从 SQL 中过滤,因为行数预计为 50k+,如果我在提取后尝试解析,这可能会减慢程序速度。

标签: python json postgresql psycopg2


【解决方案1】:

您可以使用? 运算符来检查键是否存在于jsonb 值的顶层。

SELECT data->'1'
       FROM "table"
       WHERE data ? '1';

【讨论】:

  • 数据类型为json。
  • @pundit:从长远来看,您应该重新设计架构并改用jsonb。同时,您可以上转至jsonb (... data::jsonb ...)。 (这就是为什么你应该首先提供一个正确的minimal reproducible example,包括表的DDL,所以我会知道它只是json。)
猜你喜欢
  • 2020-08-17
  • 2017-10-04
  • 2020-08-30
  • 2016-12-04
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
  • 2018-06-11
  • 2020-06-22
相关资源
最近更新 更多