Postgres JSONB查询简化

时间:2020-03-12 11:23:21

标签: sql json postgresql

我有一些工作代码,可从表单表中提取记录,其中“ mail@example.com”在JSONB字段{{1},$(document).ready(function(){ $('input').on('change',function(){ console.log($(this)); if($(this).hasClass('picktim-mins') || $(this).hasClass('picktim-hour')){ alert($(this).val()); } }) });,{{1 }}或column_a

column_b

列中的JSON类似于:

column_c

尽管代码可以正常工作,但看起来非常重复/冗长。鉴于我无法更改JSON结构,是否有更简洁的方法来构建此查询,并且我应该为那些列构建哪些索引以获得最佳性能?

1 个答案:

答案 0 :(得分:2)

为什么不使用or

SELECT f.* 
FROM forms f
WHERE EXISTS (SELECT * 
              FROM jsonb_each_text(f.column_a) as e(ky,val)
              WHERE e.val = 'mail@example.com'
             ) OR
      EXISTS (SELECT * 
              FROM jsonb_each_text(f.column_b) as e(ky,val)
              WHERE e.val = 'mail@example.com'
             ) OR
      . . .

大概,这也消除了重复消除的需要,因此查询也应该更快。

编辑:

如果需要来源,则可以使用相关的子查询:

SELECT f.* 
FROM (SELECT f.*,
             EXISTS (SELECT * 
                     FROM jsonb_each_text(f.column_a) as e(ky,val)
                     WHERE e.val = 'mail@example.com'
                    ) as in_column_a,
             EXISTS (SELECT * 
                     FROM jsonb_each_text(f.column_b) as e(ky,val)
                     WHERE e.val = 'mail@example.com'
                    ) as in_column_b,
             . . .
      FROM forms f
     ) 
WHERE in_column_a OR in_column_b OR . . .

这不是很有效,因为它在找到匹配项时不会使评估短路。另一方面,它列出了所有具有匹配项的列。

相关问题