首页 > 解决方案 > column_name/value 对的过滤表

问题描述

我有一个非常大的表,我想过滤列和值的黑名单组合。黑名单是一个表(小得多),其中一列中的列名(称为“键”)和要过滤掉的值在另一列中。我不想硬编码任何列名或值,因为黑名单将用于多个表。

我正在使用 postgreSQL 数据库。我只是一名分析师,所以我无法更改我正在使用的表格。我一直在尝试将我的主表与黑名单一起加入我的主表并过滤掉非空值,但在这种情况下如何做到这一点超出了我的范围。我也尝试过获取黑名单“键”和主表列名的不同交集,但是如何在 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

来自德国或带有移动/应用版本的任何内容都会被过滤。如黑名单中指定。

标签: sqlpostgresql

解决方案


您可以使用 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 函数。


推荐阅读