如何在 PostgreSQL plpgsql 函数中将 JSON 文本字段转换为 UUID

How to cast JSON text field to UUID in PostgreSQL plpgsql function

我在 RPC(远程过程调用)中使用了以下函数,我在其中尝试访问 JSON 对象的可选文本字段并将其转换为 UUID:

CREATE OR REPLACE FUNCTION update_wcomponent (item wcomponents)
returns wcomponents
language plpgsql
security definer
SET search_path = public
as $$
DECLARE
  existing wcomponents%ROWTYPE;
BEGIN

  UPDATE wcomponents
  SET
    modified_at = now(),
    title = item.json::json->'title',
    type = item.json::json->'type',
    -- Following line errors
    attribute_id = (item.json::json->'attribute_wcomponent_id')::text::uuid,
    json = item.json
  WHERE id = item.id AND modified_at = item.modified_at;

  -- Get the latest value
  SELECT * INTO existing FROM wcomponents WHERE id = item.id;

  return existing;
END;
$$;

然而它在将文本转换为 uuid 时出错并出现错误:

invalid input syntax for type uuid: ""310edbfb-0af1-411b-9275-3fc87948c3a5""

我post它是一个具有以下结构的JSON对象:

{
    "item": {
        "base_id": 18,
        "id": "27e46ec1-3d9a-412d-9807-8e08e515988d",
        "json": {
            "id": "27e46ec1-3d9a-412d-9807-8e08e515988d",
            "title": "",
            "type": "state_value",
            "attribute_wcomponent_id": "310edbfb-0af1-411b-9275-3fc87948c3a5"
        },
        "modified_at": "2022-04-23T22:11:13.533Z"
    }
}

attribute_wcomponent_id 是可选的,所以当它 undefined 时它工作正常,因为它只是不存在。

如何成功地将它从 json 文本属性转换为 uuid?似乎文本字符串被引用为 "310edbfb-0af1-411b-9275-3fc87948c3a5" 而不仅仅是 310edbfb-0af1-411b-9275-3fc87948c3a5.

您需要使用 ->> 运算符将 return 您的 attribute_wcomponent_id 值设为 text,而不是 json。然后在 uuid 之前转换为类型 text 是没有必要的,你不再有你看到的双引号问题。

attribute_id = (item.json::json->>'attribute_wcomponent_id')::uuid

Demo on dbfiddle