列名/值对的过滤表

时间:2019-07-03 15:43:26

标签: sql postgresql

我有一个很大的表,我想过滤该表以将列和值列入黑名单。黑名单是一张表(小得多),其中一列具有列名(称为“键”),另一列具有要过滤的值。我不想硬编码任何列名或值,因为黑名单将用于多个表。

我正在使用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的内容都会被过滤。如黑名单中所述。

1 个答案:

答案 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函数。