postgresql 检查Postgres中JSON值的值类型

v2g6jxz6  于 2023-02-18  发布在  PostgreSQL
关注(0)|答案(2)|浏览(272)

假设我有一个json列字段,如下所示:

{phone: 5555555555, address: "55 awesome street", hair_color: "green"}

我想做的是更新所有存在json键电话的条目,结果是number类型变为字符串。
我有什么是:

SELECT *
 FROM parent_object
 WHERE (fields->'phone') IS NOT NULL;

不幸的是,这仍然返回phone:null的值。我猜JSON null不等同于SQL NULL
如何1)如何排除AND (fields->'phone') <> null产生的JSON空值

LINE 4: ...phone') IS NOT NULL AND (fields->'phone') <> 'null';
 HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

2)检查该键处的值的类型,此伪代码(type_of (fields->'phone') == Integer),但在工作PGSQL中。
3)修改此项以更新列

UPDATE parent_object
 SET fields.phone = to_char(fields.phone)
 WHERE  query defined above
zy1mlcev

zy1mlcev1#

1.正如其他人所说,没有理由将变量转换为整数,只是为了将其转换为字符串。此外,电话号码不是数字。:-)
1.您需要使用->>操作符而不是->,这样才能使SELECT查询正常工作。
请注意运行此查询后两个元组值之间的差异:

SELECT fields->'phone', fields->>'phone'
FROM parent_object;

您的工作查询:

SELECT *
FROM parent_object
WHERE (fields->>'phone') IS NOT NULL;
  1. Postgres目前并不支持原子地更新JSON列中的单个键。您可以编写 Package 器UDF来提供此功能:How do I modify fields inside the new PostgreSQL JSON datatype?
t9aqgxwy

t9aqgxwy2#

为了检查key处的值的类型,postgres在文档中提供了以下内容。
json_类型(json)→文本jsonb_类型(jsonb)→文本
以文本字符串的形式返回顶级JSON值的类型。可能的类型包括对象、数组、字符串、数字、布尔值和空值。(不应将空值结果与SQL NULL混淆;参见示例)。
json_类型(“-123.4”)→编号
json_typeof(“空”::json)→空
json_typeof(空值::json)为空值→ t

相关问题