actName |       applicable       | status | id |
-----------------------------------------------------
   test1 | {"applicable":[1,3,7]} |      1 |  1 |
   test2 | {"applicable":[5,4,1]} |      1 |  2 |

是否可以检查数组中的值?例如,如果我试图在适用的行列中找到哪一行包含整数值3,则它必须返回第一行。
结果:
 actName |       applicable       | status | id |
-----------------------------------------------------
   test1 | {"applicable":[1,3,7]} |      1 |  1 |

最佳答案

您需要函数json_array_elements()来取消json数组的测试,以便可以检查它的元素。那就很容易了:

SELECT *
FROM my_table
WHERE id IN (
  SELECT id
  FROM (
    SELECT id, json_array_elements(applicable->'applicable')::text::int AS chk
    FROM my_table) sub
  WHERE chk = 3);

由于json值(因此数组元素)可以是任何类型,因此需要使用integer将它们转换为::text::int。您需要子选择来检查数组中具有id值的3值。注意,这将返回具有相同数组值的多行。如果一行中可能有多个重复的数组值,则应SELECT DISTINCT *以避免多次返回同一行。
SQLFiddle

10-08 03:49