我有两个查询,它们查看单独的数据库表,并从每个表中的JSONB列中查找格式为[“tag1”,“tag2”,“tag3”]等的项目。查询的目的是填充预测下拉列表,即如果列表包含“dog”且用户键入“d”,则应返回“dog”。这些查询中的每一个都是单独工作的,我可以轻松地将它们组合成一个JOOQ查询?
final Field<String> value = field(name("A", "value"), String.class);
final Result<Record1<String>> res1 = sql.dsl()
.selectDistinct(value)
.from(CAMPAIGN,lateral(table("jsonb_array_elements_text({0})", CAMPAIGN.TAGS)).as("A"))
.where(CAMPAIGN.STORE_KEY.equal(campaign.getStoreKey()))
.and(CAMPAIGN.CAMPAIGN_KEY.notEqual(campaignKey))
.and(value.like(search + "%%"))
.fetch();
final Result<Record1<String>> res2 = sql.dsl()
.selectDistinct(value)
.from(STOREFRONT, lateral(table("jsonb_array_elements_text({0})", STOREFRONT.TAGS)).as("A"))
.where(STOREFRONT.STORE_KEY.equal(campaign.getStoreKey()))
.and(value.like(search + "%%")).fetch();
答案 0 :(得分:0)
当然!在SQL中,&#34;结合&#34;两个查询主要使用UNION [ ALL ]
实现(其中ALL
表示您要保留重复项)。在您的情况下,请写下以下内容:
final Result<Record1<String>> result =
sql.dsl()
.select(value)
.from(
CAMPAIGN,
lateral(table("jsonb_array_elements_text({0})", CAMPAIGN.TAGS)).as("A"))
.where(CAMPAIGN.STORE_KEY.equal(campaign.getStoreKey()))
.and(CAMPAIGN.CAMPAIGN_KEY.notEqual(campaignKey))
.and(value.like(search + "%%"))
.union(
select(value)
.from(
STOREFRONT,
lateral(table("jsonb_array_elements_text({0})", STOREFRONT.TAGS)).as("A"))
.where(STOREFRONT.STORE_KEY.equal(campaign.getStoreKey()))
.and(value.like(search + "%%")))
.fetch();
请注意,我已将selectDistinct()
替换为select()
,因为UNION
操作已删除重复项,因此无需删除每个联合子查询中的重复项。< / p>