我有一个很大的表,我想过滤该表以将列和值列入黑名单。黑名单是一张表(小得多),其中一列具有列名(称为“键”),另一列具有要过滤的值。我不想硬编码任何列名或值,因为黑名单将用于多个表。
我正在使用postgreSQL数据库。我只是一名分析师,所以我无法更改正在使用的表。我一直在尝试将主表与黑名单保持连接,并过滤掉非null值,但是考虑到实际情况,我该怎么做。我还尝试过获得黑名单“键”和主表列名称的独特交集,但是如何在WHERE子句中使用它也太复杂了。
由于问题很容易描述,我想必须有一个非常简单的解决方案,但可能是错误的。
黑名单表:
"client" "key" "value"
jamba version app
jamba country DE
jamba version mobile
主表:
"client" "gender" "version" "country"
jamba m desktop DK
jamba m desktop SE
jabma f mobile DE
jamba m desktop CH
jamba f desktop DE
jamba f app GB
想要的结果:
"client" "gender" "version" "country"
jamba m desktop DK
jamba m desktop SE
jamba m desktop CH
任何来自德国或版本为mobile / app的内容都会被过滤。如黑名单中所述。
答案 0 :(得分:2)
您可以使用JSON进行此操作:
select m.*
from main m
where not exists (select 1
from blacklist bl
where bl.client = m.client and
bl.value = to_jsonb(m.*)->>bl.key
);
这假设已知client
在您所引用的表中。如果没有,您当然也可以使用json函数。