ilyaplot Asked:2020-08-10 22:11:10 +0000 UTC2020-08-10 22:11:10 +0000 UTC 2020-08-10 22:11:10 +0000 UTC 如何从 JSON 中按值选择 772 有一个包含类型字段的表json。表格中填满了[123,854,12], [],之类的值[12,2142141,24] 如何在json中选择包含某个数字的行? 那些。如果我搜索12,那么我应该得到上面列出的值的两行。 postgresql 3 个回答 Voted Best Answer cheops 2020-08-10T22:38:01Z2020-08-10T22:38:01Z 如果您使用的是 PostgreSQL,那么使用 not 会更明智JSON,但是类型ARRAY CREATE TABLE tbl ( id INTEGER, name INTEGER ARRAY ); INSERT INTO tbl VALUES (1, '{123,854,12}'); INSERT INTO tbl VALUES (2, '{}'); INSERT INTO tbl VALUES (3, '{12,2142141,24}'); 然后,要搜索数组中name值为 12 的行,可以使用以下查询 SELECT * FROM tbl WHERE 12 = ANY (name); id | name ----+----------------- 1 | {123,854,12} 3 | {12,2142141,24} Мелкий 2020-08-10T22:41:26Z2020-08-10T22:41:26Z 为什么json不jsonb呢?或者一般来说int[],稍微改变存储格式是否可以接受? 有一个不明显的问题。天真的解决方案where fieldname ? 12- 没有这样的运营商。并且where fieldname ? '12'- 自然地false,数组中有数字,而不是字符串。 解决方法是通过交集与另一个 json 数组进行比较: WHERE fieldname @> '[12]'::jsonb 如果由于json某种原因你不能改变它,那么就没有@>json 的运算符,你需要弄清楚为什么你不能转换为jsonb. 如果出于某种充分的原因无法转换该字段,那么您可以即时转换它: WHERE fieldname::jsonb @> '[12]'::jsonb 如果问题是你有一个旧版本postgresql并且不能jsonb(即 9.4 之前) - 那么问题就是。您可以编写一个商店来解析 json 并检查值。 ilyaplot 2020-08-11T18:30:25Z2020-08-11T18:30:25Z 是不是这样: select id, param from (select id, json_array_elements(params)::text as param from table) s where param = 12::text 显示 json 数组中包含 12 的所有行。 在他们提出更好方法的答案中,我将使用它。
如果您使用的是 PostgreSQL,那么使用 not 会更明智
JSON,但是类型ARRAY然后,要搜索数组中
name值为 12 的行,可以使用以下查询为什么
json不jsonb呢?或者一般来说int[],稍微改变存储格式是否可以接受?有一个不明显的问题。天真的解决方案
where fieldname ? 12- 没有这样的运营商。并且where fieldname ? '12'- 自然地false,数组中有数字,而不是字符串。解决方法是通过交集与另一个 json 数组进行比较:
如果由于
json某种原因你不能改变它,那么就没有@>json 的运算符,你需要弄清楚为什么你不能转换为jsonb. 如果出于某种充分的原因无法转换该字段,那么您可以即时转换它:如果问题是你有一个旧版本
postgresql并且不能jsonb(即 9.4 之前) - 那么问题就是。您可以编写一个商店来解析 json 并检查值。是不是这样:
显示 json 数组中包含 12 的所有行。
在他们提出更好方法的答案中,我将使用它。