SQLITE:筛选出多列

时间:2017-09-19 11:04:44

标签: sql sqlite

我有以下示例表。

1 2 3
A| |B  -- Row 1
 | |A  -- Row 2
 |B|   -- Row 3
 | |   -- Row 4
A|A|A  -- Row 5
C| |C  -- Row 6

我的目标是系统地过滤掉''行(大概使用!= WHERE子句)。我知道如何过滤' in'使用= WHERE子句的行但不确定是否可以过滤' out'行。请参阅以下三个示例:

1)过滤掉A(即留下任何包含B,C或空白的行):

- >这应该返回除第5行之外的所有内容,因为每隔一行包含至少1个B,C或空白单元

2)过滤掉A AND Blanks(即留下任何包含B或C的行):

- >这应返回第1,3,6行,因为这些行中的每一行都包含B或C

3)过滤掉空白(即留下包含A,B或C的任何行):

- >返回第1,2,3,5,6行,不包括第4行,因为这不包括A,B或C

使用=子句生成查询的函数是:

void filterInRows(String colFilter)
{
    List uniqueCols = ['A', 'B', 'C', ''];
    String query = 'SELECT * FROM Test WHERE ';
    int filterCounter = 0;
    uniqueCols.forEach((String col)
   {
       if(col != colFilter)
       {
           query += (filterCounter != 0) ? ' AND ' : ''; 
           query += "One = '$col' OR Two = '$col' OR Three = '$col'";
           filterCounter++;
       }
   });

   query += ';';
}

例如,如果我们调用filterInRows(' A'),那么我们会回来:

SELECT * FROM Test WHERE One = 'B' OR Two = 'B' OR Three = 'B' AND One = 'C' OR Two = 'C' OR Three = 'C' AND One = '' OR Two = '' OR Three = '';

这解决了上面的第一个例子。但是,我一直在编写一个函数/查询,它允许我实现同样的事情,但是过滤掉行而不是过滤。如下所示的查询由于显而易见的原因而无法实现:

SELECT * FROM Test WHERE One != 'A' OR Two != 'A' OR Three != 'A';
SELECT * FROM Test WHERE One != 'A' AND Two != 'A' AND Three != 'A';

我正在使用SQLite。上面的代码是用Dart编写的,但只是一个例子 - 对于任何其他语言的反例都很开心。我的目标是过滤掉东西,而不是过滤掉东西。我相信你需要使用!=但是如果它们存在的话我会使用不同的关键字。如果我没有清楚地解释这个问题,请告诉我。提前谢谢。

1 个答案:

答案 0 :(得分:1)

使用is not

SELECT *
FROM Test
WHERE One IS NOT 'A' AND Two IS NOT 'A' AND Three IS NOT 'A';

正如文档所解释的那样,这是SQLite中的NULL - 安全运算符:

  

ISIS NOT运算符的工作方式类似于=!=,除非有一个或两个   操作数是NULL。在这种情况下,如果两个操作数均为NULL,   然后IS运算符求值为1(true)和IS NOT运算符   评估为0(假)。如果一个操作数为NULL而另一个不是,   然后IS运算符求值为0(false),IS NOT运算符为   1(真)。

在ANSI SQL中,ISIS NOT DISTINCT FROM。有些数据库使用<=>