Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL获取与我的条件匹配的行_Sql - Fatal编程技术网

SQL获取与我的条件匹配的行

SQL获取与我的条件匹配的行,sql,Sql,我有一个简单的SQL表,它包含以下内容: +---------------------+ | id | mode | value | +---------------------+ | 1 | EXCLUDE | 10 | | 2 | INCLUDE | 10 | | 3 | EXCLUDE | 10 | | 3 | EXCLUDE | 20 | +---------------------+ 想象一下这些都是产品。产品1具有除10以外的所有值。产品2的值仅为10。

我有一个简单的SQL表,它包含以下内容:

+---------------------+
| id | mode   | value |
+---------------------+
|  1 | EXCLUDE |  10  |
|  2 | INCLUDE |  10  |
|  3 | EXCLUDE |  10  |
|  3 | EXCLUDE |  20  |
+---------------------+
想象一下这些都是产品。产品1具有除10以外的所有值。产品2的值仅为10。产品3具有除10和20以外的所有值

我需要一个给定值的sql,我应该返回该值有效的所有产品

e、 g.值为10应返回产品2。值30应返回乘积1和3

我试过这个:

SELECT * 
FROM products 
WHERE  ( mode = 'INCLUDE' AND value IN( 10) ) OR 
       ( mode = 'EXCLUDE' AND value NOT IN ( 10 ) )
例如,对于值10,它还返回第4行,这是基于sql的预期值。我怎样才能修好它?我想根据id对排除项进行分组,并使用
not exists()

使用
不存在()


您的问题是
id
s在多行上。因此,考虑
分组依据
,其中的条件为:

SELECT p.id
FROM products p
GROUP BY p.id
HAVING SUM(CASE WHEN mode = 'INCLUDE' and VALUE IN (10) THEN 1 ELSE 0 END) > 0 OR
       (SUM(CASE WHEN mode = 'EXCLUDE' THEN 1 ELSE 0 END) > 0 AND -- has excludes 
        SUM(CASE WHEN mode = 'EXCLUDE' and VALUE IN (10) THEN 1 ELSE 0 END) = 0 -- but not this one
       );
这是复杂的逻辑。我认为逻辑是:

  • 如果任何
    id
    明确包含该值,则保留该id
  • 如果任何
    id
    明确排除该值,请删除该id
  • 如果任何行排除其他值,但不排除此值,请保留id

    • 您的问题是
      id
      s在多行上。因此,考虑
      分组依据
      ,其中的条件为:

      SELECT p.id
      FROM products p
      GROUP BY p.id
      HAVING SUM(CASE WHEN mode = 'INCLUDE' and VALUE IN (10) THEN 1 ELSE 0 END) > 0 OR
             (SUM(CASE WHEN mode = 'EXCLUDE' THEN 1 ELSE 0 END) > 0 AND -- has excludes 
              SUM(CASE WHEN mode = 'EXCLUDE' and VALUE IN (10) THEN 1 ELSE 0 END) = 0 -- but not this one
             );
      
      这是复杂的逻辑。我认为逻辑是:

      • 如果任何
        id
        明确包含该值,则保留该id
      • 如果任何
        id
        明确排除该值,请删除该id
      • 如果任何行排除其他值,但不排除此值,请保留id

      @stefanozanii正确,是一个打字错误。30的值应该返回1和3。30来自哪里?您所指的所有值都是什么?@vkp它们可以是任何值,没有限制。“排除”是指除上述值以外的任何值。是否有一个包含所有可能值的列表?@stefanozanii correct,是一个拼写错误。30的值应该返回1和3。30来自哪里?您所指的所有值都是什么?@vkp它们可以是任何值,没有限制。因此,排除意味着除了所提到的以外的任何值。是否存在某个可能的值的列表?如果要用C++语言这样的语言,你会返回产品并在顶层上做任何逻辑吗?(在调用my db wrapper的函数中)。会更快吗?@Ghostider。一般来说,在数据库中执行逻辑更快。要在应用程序中执行逻辑,需要将不必要的行返回到应用程序进行附加处理。如果要在C++语言中使用,那么您只需返回产品并在顶层上执行任何逻辑吗?(在调用my db wrapper的函数中)。会更快吗?@Ghostider。一般来说,在数据库中执行逻辑更快。要在应用程序中执行逻辑,需要将不必要的行返回到应用程序以进行额外处理。当
      value=30时,这将返回
      1,2,3
      而不是
      1,3
      ,当
      value=30
      SELECT DISTINCT
          p.id
      FROM
          products p
      WHERE
          EXISTS ( SELECT 1 FROM products WHERE id = p.id AND value = 10 AND mode = 'INCLUDE' )
          OR 
          NOT EXISTS ( SELECT 1 FROM products WHERE id = p.id AND value = 10 AND mode = 'EXCLUDE')