【问题标题】:How to filter a table based on a specific column value of another column?如何根据另一列的特定列值过滤表?
【发布时间】:2021-06-10 07:11:17
【问题描述】:

你好,我这里有一张桌子

---------------------
ID | PARTY | Name.Id
---------------------
1  | IND   | 12
2  | IND   | 13
3  | CUST  | 14
4  | CUST  | 15
5  | CUST  | 16
6  | IND   | 17
---------------------

我想返回整个表,但在“Name.Id”列中过滤值 15 和 16 的“CUST”

结果应该是这样的

---------------------
ID | PARTY | Name.Id
---------------------
1  | IND   | 12
2  | IND   | 13
3  | CUST  | 14
4  | IND   | 17
---------------------

我尝试在“Name.Id”上使用where 语句,但它只返回值为 15 和 16 的行。

【问题讨论】:

  • "值为 15 和 16 的行" 没有值是 15 和 16。要么说 " 具有值 15 或 16 的行 " 要么说 " 具有值 15 的行和行值为 16"。 (每个都建议一个不同的查询。) PS 要么说“有的行”,要么说“有的每一行”。 PS 这是一个很容易找到的常见问题解答。在考虑发布之前,请阅读手册和谷歌任何错误消息以及您的问题/问题/目标的许多清晰、简洁和精确的措辞,带有和不带有您的特定名称/字符串/数字、“site:stackoverflow.com”和标签;阅读许多答案。反映你的研究。 How to Askhelp center
  • 代码问题需要minimal reproducible example。同时展示你的能力。

标签: mysql sql join


【解决方案1】:

整个表,但在“Name.Id”列中过滤了值 15 和 16 的“CUST”

听起来你想要这样的 where 子句:

WHERE NOT (party = 'CUST' and name.id IN(15,16))

但是 CUST 从您的示例数据中似乎是多余的,即您可以将其简化为 WHERE name.id NOT IN (15,16)

【讨论】:

  • 也写成party != 'CUST' or name.id not in (15, 16) 应该可以工作。
  • 在我看来,这不是那么容易推理出来的,这就是为什么我按我的方式写它的原因。 OP 已经说过“[except] CUST with Name.id of 15 and 16”实际上应该写成“[except] CUST with Name.id of 15 OR 16” - 人类使这种语言总是犯错——“把所有的苹果和香蕉都从盒子里拿出来”——水果不能既是苹果又是香蕉,但我们知道这意味着什么。无论如何,我离题了。虽然您可能会欣赏 not(a = 1 and b = 2) 等同于 a != 1 or b != 2 但并非所有人都如此,所以我选择了最接近自然语言表达的构造
  • 另外,请注意!= os 不是用于不等式的标准 SQL;我努力尽可能地编写标准答案以实现最大的交叉移植性
【解决方案2】:

你可以试一试吗?

select *
from t
where (PARTY, Name.Id) not in (
     select 'CUST', 15
     union
     select 'CUST', 16
)

【讨论】:

  • 这行 where (PARTY, NAME.Id) 是否有语法错误?
  • 你有那个很奇怪。在字段名称中。尝试用 'Name.Id' 引用它。
【解决方案3】:
select *
from t
    where Party not in
        (select Party from t
            where Party="CUST" 
                and (Name.Id=15 or Name=16));

【讨论】:

  • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
  • 这正是任务的条件:Party = 'CUSt' and Name.Id = 15 or Name.Id = 16时一定没有记录
【解决方案4】:

我想我在这里找到了解决方案

select *
from t
where Party <> 'CUST'
or (Party = 'CUST'
and Name.Id = 14))

【讨论】:

  • 不执行“15 或 16”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-14
  • 1970-01-01
  • 1970-01-01
  • 2016-01-06
  • 2015-03-26
相关资源
最近更新 更多