2017-09-19 30 views
0

我有以下示例表。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 

我的目的是系統地過濾'out'行(推測使用!= WHERE子句)。我知道如何使用= WHERE子句過濾'in'行,但不確定是否可以過濾'out'行。請看下面的三個例子:

1)過濾掉(即離開含B,C或空白的)任何行:

- >除了5行,因爲每隔一行包含這應返回的一切至少1 B,C或空白細胞

2)過濾掉和空白(即留下含有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

使用is not

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

如文檔解釋說,這是SQLite中的NULL -safe操作:

ISIS NOT運營商合作像=!=除非一個或兩個操作數的 是NULL。在這種情況下,如果兩個操作數都是NULL, ,那麼IS運算符評估爲1(true)並且IS NOT運算符 評估爲0(false)。如果一個操作數爲NULL,並且另一種是不, 則IS操作者的計算結果爲0(假)和操作者IS NOT是 1(真)。

在ANSI SQL中,ISIS NOT DISTINCT FROM。一些數據庫使用<=>