SQL - 当列具有来自列表的值和不在同一列表中的值时

标签 sql postgresql amazon-redshift

不确定最好的表达方式,但我正在寻找一种方法来指定条件,当列中的值在给定列表中至少有一个值并且值不在同一列表中时,则该列的值应该出现。示例表:

email           program
john@john.com   program1
john@john.com   program2
john@john.com   program3
jeff@jeff.com   program3
jeff@jeff.com   program4
steve@steve.com program1
steve@steve.com program2

如果我有这个表和一个列表 (program1, program2),如果与给定电子邮件关联的程序至少匹配给定列表中的一个并且如果给定电子邮件具有程序不在给定列表中

因此,对于上面的表格和上面的给定列表,我们会显示正确的查询:

email
john@john.com

如有任何帮助,我们将不胜感激。注意:这将在 Redshift/PostgreSQL 中

最佳答案

我喜欢用 group byhaving 来做到这一点。这是一个非常通用的方法:

select email
from t
group by email
having sum( (program = 'program1')::int ) > 0 and
       sum( (program = 'program2')::int ) = 0;

在这种情况下,需要“program1”而“program2”不是。而且,您可以继续添加条件——想添加多少就添加多少。

我忘了 Redshift 是否支持 :: 语法。您始终可以使用标准 SQL 表达这一点:

having sum( case when program = 'program1' then 1 else 0 end ) > 0 and
       sum( case when program = 'program2' then 1 else 0 end ) = 0;

编辑:

我认为@dnswit 对 OP 问题的解析是正确的。逻辑是:

having sum( (program in ('program1', 'program2'))::int ) > 0 and
       sum( (program not in ('program1', 'program2'))::int ) > 0;

关于SQL - 当列具有来自列表的值和不在同一列表中的值时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48724369/

相关文章:

postgresql - 如何使用 KnexJS 创建值列表

sql - 在一个连接表上使用组合条件连接

sql - 一次删除相关信息,避免嵌套查询(PostgreSql)

amazon-web-services - 检查 Redshift 中用户的 "CONNECTION LIMIT"

amazon-redshift - 将表从一个 redshift 集群复制到另一个 redshift 集群(不使用 s3)

c# - NHibernate:in() 的反向版本?

c# - SQL UPDATE 循环非顺序键

sql - 在具有逻辑的 SELECT 语句中使用 MAX

amazon-web-services - Redshift - 复制多个 list 文件

sql - 在不同的不同行上获取 sum() MySQL