Postgres jsonb列从字符串与通配符匹配的数组中选择

时间:2019-09-13 10:39:30

标签: sql arrays postgresql jsonb

我希望将postgres jsonb列与数组一起使用并能够对其进行过滤,所以我有一个带有列的架构:

CREATE TABLE testtable
(
id  varchar(32) NOT NULL,   
refs    jsonb           NULL,
)

,该列包含Json格式的数据:

{ "refs": ["one-1-0", "two-3-2", "two-3-4" ] }

我希望能够返回包含以(例如)“ two-3-”开头的数组元素的所有行。

我已经尝试了好几种方法,但并不能使它正常工作(我最接近的是将数组部分作为文本获取并以字符串形式进行搜索-但这很讨厌)

我还想在此列中添加合适的索引以支持此查询。

任何建议都将令人赞叹并得到好评! 谢谢

1 个答案:

答案 0 :(得分:3)

step-by-step demo:db<>fiddle

const myArray = [
  '/unit/unit/225/unit-225.pdf',
  '/nit/nit-dep/4.11/nit-4.11.pdf',
  '/nit/nit-dep/4.12/nit-4.12.pdf',
  '/org/viti/viti-engine/5.1/viti-engine-5.1.pdf',
  '/org/viti/viti-spring/5.1/viti-spring-5.1.pdf'
];
var parentObject = {}
myArray.forEach((str) => {
  const props = str.slice(1).split('/');
  const filename = props.pop();
  const lastObj = props.reduce((a, prop) => {
    if (!a[prop]) {
      a[prop] = {};
    }
    return a[prop];
  }, parentObject);
  lastObj[filename] = [];
});
console.log(parentObject);
  1. 将数组扩展为每个数组元素一行
  2. 使用SELECT DISTINCT -- 3 id, refs FROM testtable, jsonb_array_elements_text(refs -> 'refs') -- 1 WHERE value LIKE 'two_3%' -- 2 比较器和value通配符按数组元素(LIKE)过滤所有记录
  3. 如果发生多个事件,则每个事件将返回一条记录。因此,如果您只想要原始数据集,则可以使用%
  4. 删除重复项