我有一些工作代码,可从表单表中提取记录,其中“ 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结构,是否有更简洁的方法来构建此查询,并且我应该为那些列构建哪些索引以获得最佳性能?
答案 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 . . .
这不是很有效,因为它在找到匹配项时不会使评估短路。另一方面,它列出了所有具有匹配项的列。