当前位置: 首页 > 知识库问答 >
问题:

从Postgres中的JSONB字段中选择非空值

司寇正志
2023-03-14

在Postgres9.5中,我无法从JSONB字段中的属性中选择非空值

从mytable中选择data->>“property”,其中data->>“property”不为空;

我还尝试使用NotNull。

当我运行其中一个时,我收到错误42883。“错误:运算符不存在。JSONB->>布尔提示:没有与给定名称和参数类型匹配的运算符。您可能需要添加显式类型转换。”

共有1个答案

裴承安
2023-03-14

我很快测试了一下你的问题,没有发现问题:

patrick@brick:~$ psql -d test
psql (9.5.0)
Type "help" for help.

test=# CREATE TABLE mytable (id serial PRIMARY KEY, data jsonb);
CREATE TABLE
test=# INSERT INTO mytable (data) VALUES
('{"ip": "192.168.0.1", "property": "router"}'),
('{"ip": "127.0.0.1", "property": "localhost"}'),
('{"ip": "192.168.0.15", "property": null}');
INSERT 0 3
test=# SELECT * FROM mytable;
 id |                     data
----+----------------------------------------------
  1 | {"ip": "192.168.0.1", "property": "router"}
  2 | {"ip": "127.0.0.1", "property": "localhost"}
  3 | {"ip": "192.168.0.15", "property": null}
(3 rows)

test=# SELECT data->>'property' FROM mytable WHERE data->>'property' IS NOT NULL;
 ?column?
-----------
 router
 localhost
(2 rows)

请注意,在jsonb中,应该在输入中精确指定null值(如上面的示例所示),而不是在引用的某个版本中。如果值不是null而是一个空字符串或类似于' ' 字符串)的东西,那么您应该调整测试以查找以下内容:where data->>'property'=''。如果是这种情况,您可以考虑使用jsonb_set()将这些值设置为真jsonnull

顺便说一句,您还可以:

SELECT data->>'property' FROM mytable WHERE data->'property' IS NOT NULL;

即测试jsonb值是否为null而不是将其转换为text。更有效率,当然是在更大的桌子上。这显然只适用于truenulls。

 类似资料:
  • 我有一张相对较小的桌子(约5万行)。当我选择所有记录时,需要大约40秒。该表有3个JSONB列。当我选择除JSONB之外的每一列时,查询大约需要700ms。 如果我只添加一个JSONB字段,查询时间会跳到近10秒。 我从来没有使用where子句引用JSONB中的内容,只是选择*。尽管如此,我还是尝试添加GIN索引,因为我经常看到它们被提到是JSONB的性能提升器。 我已经运行了一个完全真空。 Po

  • 我正在通过Postgres Jsonb留档,但无法找到一个小问题的解决方案,我有。 我有一张桌子:MY_TABLE 具有以下列: 用户、姓名、数据和购买 需要注意的是,“数据”是一个jsonb,有多个字段。“Data”中的一个字段是“Attribute”,但它当前是一个字符串。我如何才能将其更改为字符串列表? 我曾尝试使用json\u build\u数组,但没有任何运气 例如,我希望我的jsonb

  • 我正在尝试从一个select表单中获取一个时间值。我在代码中看不到任何错误,尝试更改所有类名和变量,但值仍然没有被get select。(提交表单后我看不到所选的值) 代码添加如下:

  • 问题内容: 对此不熟悉,尝试按照著名的Flask教程使用Flask-bootstrap,Flask-wtforms,Jinja等构建一个应用程序 我有一个带有2个选择字段和一个按钮的表单。 我只希望第一个字段预先填充,而另一个字段根据前一个字段的选定值填充(在客户端?)。 在模板中,我尝试类似 可以正常工作(只要我返回元组列表以使用正确的javascript和路由填充下一个字段),但我想要以下内容

  • 问题内容: 我正在使用Postgresql 9.4,并具有一个表,带有和,如下所示: 如何在列的内部字段上将每个组作为数组返回?具体来说,我正在寻找的结果是: 试: 产量: 问题答案: 您必须使用运算符,而不是在正确的操作数是json路径时使用。试试这个: 产量:

  • 问题内容: 使用Python,如何将字段提取为变量?基本上,我将其转换为: 像 问题答案: 假设您将该字典存储在一个名为值的变量中。要进入变量,请执行以下操作: 如果该json位于文件中,请执行以下操作以加载它: 如果该json来自URL,请执行以下操作以加载它: 要打印所有条件,您可以: