postgresql 使用::text[]转换JSON数组未按预期工作

mpbci0fu  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(3)|浏览(218)

我使用::text[]来转换JSON列中的数组,如下面的示例所示:
假设sometable有一个名为'object'的JSON列,其结构如下:

{ "properties": ["string", "someotherstring"] }

我这样查询db:

SELECT * FROM db.sometable
WHERE 'string' = ANY (ARRAY[object -> 'properties']::text[]);

我期望ARRAY[object -> 'properties']::text[]返回某种字符串列表,如下所示:

{"string", "someotherstring"}

...但是,经过一些调试,我意识到它返回了一些wierd s***,如下所示:

{"[\"string\", \"someotherstring\"]"}

基本上,它将整个数组视为一个字符串!会是什么原因呢?
PS:我知道我应该使用其他函数或过滤器,但我正在处理的真实的查询是高度动态的,比我提供的示例更复杂。::text[]似乎是我唯一的选择
提前感谢您的帮助!
我期望::text[]将JSON数组转换为字符串列表,但实际上它将整个数组视为字符串。

wmvff8tz

wmvff8tz1#

没有理由将json转换为Postgres数组。你需要一个合适的接线员。

select * 
from sometable
where object -> 'properties' ? 'string';

db<>fiddle.中测试
阅读JSON函数和运算符in the documentation.

dwbf0jvd

dwbf0jvd2#

结合使用json_array_elements_textARRAY将json数组转换为文本值列表TEXT[]

SELECT * 
FROM sometable
WHERE 'string' = ANY (ARRAY(SELECT json_array_elements_text(object->'properties')));

这是另一种在json数组中查找元素的方法:

SELECT s.*
FROM sometable s, json_array_elements_text(object->'properties') as j
where j.value = 'string'

Demo here

iecba09b

iecba09b3#

希望这能解决你的问题
表格内容:a screenshot of the table content

SELECT string_to_array(element, ',') AS string_array
FROM (
  SELECT json_array_elements_text(object -> 'properties') AS element
  FROM untitled_table_225
) subquery;

它给出以下输出:
a screenshot of the solution output
如你所见,记录包含“{”和“}”;我只是使用regexp_replace函数删除了它们。
现在的SQL是这样的:

SELECT regexp_replace(string_to_array(element, ',')::text, '\}|\{', '', 'g') AS string_array
FROM (
  SELECT json_array_elements_text(object -> 'properties') AS element
  FROM untitled_table_225
) subquery;

结果:a screenshot of the final results

相关问题