如何在 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
我在 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