sql - 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
来自德国或带有移动/应用版本的任何内容都会被过滤。如黑名单中指定。
解决方案
您可以使用 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 函数。
推荐阅读
- c++ - boost::lexical_cast 到 std::string 什么时候失败?
- javascript - node.js 中的 JSGI 和 `http.createServer()` 是执行服务器端 JavaScript Web 应用程序的两种替代方式吗?
- python - 如何抓取 youtube 评论及其发布日期
- ansible - Ansible Playbook:如何将无法访问的清单主机名写入文件
- loadrunner - Oracle EBS 中的负载运行程序记录问题
- flask - 命令输出中的空格和列未保留在烧瓶响应中
- c# - .NET 测试 Linux 代码依赖于 Windows 上的 Environment.OSVersion.Platform
- java - 分离和重新附加部件时,小部件被处理异常
- javascript - 水平打印 Google 表格中的图表
- javascript - 如何从输入框值中查询