【问题标题】:MS SQL: SELECT field1, field2 from [table] where field2 NOT IN ('val1', val2') when field1 = 'value2'MS SQL: SELECT field1, field2 from [table] where field2 NOT IN ('val1', val2') when field1 = 'value2'
【发布时间】:2015-10-07 12:13:43
【问题描述】:

我目前无法过滤我的 SQL 记录。我需要类似它导致以下概念的东西:

我想将一些记录的结果基于同一张表中另一个字段的结果。像下面这样说:

SELECT [Field1], [field2] 
FROM [table]
WHERE [Field1] IN ('value1', 'value2')
--from 'value2' i need to filter or remove some records 
WHERE [field2] NOT IN ('val1','val2') When [Field1] is 'value2'

我已经在这方面花费了很多时间,但我仍然无法做正确的事情。 我将不胜感激。

【问题讨论】:

    标签: sql sql-server database subquery


    【解决方案1】:

    从最佳答案(@Siyual's)开始,您可以对其进行优化以减少维护:

    SELECT  [Field1], [field2] 
    FROM    [table]
    WHERE   ([Field1] = 'value2' AND [field2] NOT IN ('val1','val2'))
    OR      ([Field1] = 'value1')
    

    使用[Field1] = 'value1'[Field1] in('value1', 'value3', 'value...', 'valueN') 意味着只要将新值放入[Field1],您的查询就会中断。你会更好用[Field1]!='value2'替换,给你:

    SELECT  [Field1], [field2] 
    FROM    [table]
    WHERE   ([Field1] = 'value2' AND [field2] NOT IN ('val1','val2'))
    OR      ([Field1] != 'value2')
    

    从那里,您还可以应用逻辑运算符来实现您在说WHERE (A && B) || !A,在这种情况下,XOR 或 OR 之间没有区别,这意味着它等同于 WHERE (!A)||B,这给了您:

    SELECT  [Field1], [field2] 
    FROM    [table]
    WHERE   ([Field1] != 'value2') OR [field2] NOT IN ('val1','val2'))
    

    【讨论】:

    • 实际上最佳答案是最接近的答案。我只是想知道我还缺少什么。
    • 我重写了整篇文章以更好地解释我的观点。基本上,我和@Siyual 做的事情是一样的,所以只要你不添加任何新数据,我们的两个查询应该做的完全一样。
    • 谢谢!我明白你的建议,但它并没有给我想要的结果。我想要得到的是使用从第一个过滤器到我的下一个过滤器的一些结果。就像什么是 [field1] IN (SELECT DISTINCT category from anotherTable) - 第一个过滤器的结果将是第二个过滤器的基础..所以,如果类别包括“value2”,我将不得不过滤其中的记录field1 是值 2 排除显示具有“val1”和“val2”的那些记录,以便过滤的唯一记录是那些等于 [field1] 中 value2 的记录
    【解决方案2】:

    两个字段的小逻辑。

       SELECT [Field1], [field2] 
         FROM [table]
        WHERE [Field1] IN ('value 1' , ... ) -- Other non value 2 values
           OR (Field1 = 'Value 2' AND [field2] NOT IN ('val1','val2'))
    

    【讨论】:

    • 这实际上有帮助,除了“ [field1] IN ('value1, 'value2') ”实际上是这样的.. [field1] IN (SELECT DISTINCT [field] from [TABLE2]) 所以值2 实际上是另一个查询的一部分..
    • Moraler,考虑一下您要如何过滤的逻辑是个好主意。如果你能把它写成一个简单的句子,那么你就可以生成你的 where 子句。
    • 我确实做到了。我还是想不通。哈哈!就是这个。
    • 我确实做到了。我还是想不通。哈哈!它是这样的......从表中获取字段 1 和字段 2,其中字段 1 从另一个表中具有此值,并且如果另一个表中的记录是 value2,则不显示一些具有 val1 和 val2 的记录
    【解决方案3】:

    您需要分离每个条件的逻辑。

    SELECT  [Field1], [field2] 
    FROM    [table]
    WHERE   ([Field1] = 'value2' AND [field2] NOT IN ('val1','val2'))
    OR      ([Field1] = 'value1')
    

    【讨论】:

      【解决方案4】:

      不清楚你真正想要什么。

      但我猜

      SELECT [Field1], [field2] FROM [table]
      WHERE [Field1] in ('value1', 'value2')
      and [field2] !=(case 
      when [Field1]='value1' THEN 'val1'
      when [Field1]='value2' THEN 'val2'
      
      .
      .
      .
      End)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-19
        • 2011-04-06
        • 2022-01-05
        • 1970-01-01
        • 2012-05-27
        • 2019-05-16
        相关资源
        最近更新 更多