如何使用where子句来检查postgres中数组中存在的值

时间:2016-01-13 07:39:15

标签: arrays json postgresql

 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 | 

1 个答案:

答案 0 :(得分:2)

你需要函数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的{​​{1}}值。请注意,这将返回具有相同数组值的多个行。如果单行中可能存在多个重复的数组值,则应3以避免多次返回同一行。

<强> SQLFiddle