我有以下示例表。
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编写的,但只是一个例子 - 对于任何其他语言的反例都很开心。我的目标是过滤掉东西,而不是过滤掉东西。我相信你需要使用!=但是如果它们存在的话我会使用不同的关键字。如果我没有清楚地解释这个问题,请告诉我。提前谢谢。
答案 0 :(得分:1)
使用is not
:
SELECT *
FROM Test
WHERE One IS NOT 'A' AND Two IS NOT 'A' AND Three IS NOT 'A';
正如文档所解释的那样,这是SQLite中的NULL
- 安全运算符:
IS
和IS NOT
运算符的工作方式类似于=
和!=
,除非有一个或两个 操作数是NULL
。在这种情况下,如果两个操作数均为NULL
, 然后IS
运算符求值为1(true)和IS NOT
运算符 评估为0(假)。如果一个操作数为NULL而另一个不是, 然后IS
运算符求值为0(false),IS NOT
运算符为 1(真)。
在ANSI SQL中,IS
为IS NOT DISTINCT FROM
。有些数据库使用<=>
。