PostgreSQL中如何将NEW/OLD对象转换为文本?
解决方案
1. 直接将NEW/OLD对象转为完整JSON文本
要获取NEW/OLD对象的完整JSON字符串,只需用row_to_json()转换后直接做类型转换即可:
row_to_json(NEW)::text
这会直接返回类似'{"id":1,"name":"test","value":"foo"}'的完整JSON文本。
2. 构造包含ChangeType的完整JSON对象
不要手动用CONCAT拼接JSON(容易出现转义错误),推荐用PostgreSQL内置的json_build_object()来构造目标JSON,再转为文本:
json_build_object( 'ChangeType', 'INSERT', 'NEW', row_to_json(NEW) )::text
执行后会得到你想要的格式:'{"ChangeType":"INSERT","NEW":{"a":{"b":"foo"}}}'
如果使用JSONB类型(性能更优),可以用to_jsonb()和jsonb_build_object():
jsonb_build_object( 'ChangeType', 'INSERT', 'NEW', to_jsonb(NEW) )::text
你之前的错误原因
你尝试的->> '{}'、#>> '{}'、json_extract_path_text(..., '{}')都是提取JSON内部特定字段/路径的语法,不是用来获取整个JSON对象的。row_to_json(NEW)本身已经是完整的JSON对象,不需要额外的路径提取操作,直接转成文本就能得到完整内容。
内容的提问来源于stack exchange,提问作者ahmet gül
相关产品推荐
相关产品推荐

