2013-10-24 71 views
3

我是數據庫和SQL的新手,並嘗試從3天開始解決此問題。我有一個用JDBC查詢SQLite數據庫的Java應用程序。迄今爲止,這工作非常好。但我無法弄清楚我需要檢索所需的行的SQL查詢。該表是這樣的:SQL - 選擇具有大多數匹配列的行

rowid | application | dstIP   | dstPort | value_to_return 
     |    |    |   | 
0  | NULL  | NULL   | NULL | 26 
1  | NULL  | NULL   | 80  | 1 
2  | NULL  | 192.168.178.31 | NULL | 2 
3  | NULL  | 192.168.178.31 | 80  | 3 
4  | firefox  | NULL   | NULL | 4 
5  | firefox  | NULL   | 80  | 5 
6  | firefox  | 192.168.178.31 | NULL | 6 
7  | firefox  | 192.168.178.31 | 80  | 7 

我的目標是讓大多數comlumns匹配,如果不匹配列第0行應選擇行。 這裏是一些例子:

input      -> row 

firefox 192.168.178.31 80 -> 7 
chrome 192.168.178.31 81 -> 2 
chrome 192.168.178.30 82 -> 0 
someapp 192.168.178.29 80 -> 1 

我最好的猜測到目前爲止,這是查詢

SELECT * FROM table WHERE (application IS ? OR application IS NULL) 
         AND (dstIP IS ? OR dstIP IS NULL) 
         AND (dstPort IS ? OR dstPort IS NULL) 
         ORDER BY application; 

在S與相應的輸入值替換?如果不匹配,此查詢返回行0。但是如果有幾個匹配,它會返回幾行當然。
我可以在Java應用程序中選擇所需的行,但我希望數據庫能夠爲我工作。
如果存儲過程對於這個問題是更好的選擇,我可以改變數據庫,因爲SQLite不支持這個。

我希望我能夠足夠精確地描述問題。任何幫助將不勝感激。

回答

4

這應該做的伎倆:

SELECT * FROM (
    SELECT *, CASE application WHEN ? THEN 1 WHEN NULL THEN 0 ELSE NULL END 
      + CASE dstIP WHEN ? THEN 1 WHEN NULL THEN 0 ELSE NULL END 
      + CASE dstPort WHEN ? THEN 1 WHEN NULL THEN 0 ELSE NULL END AS Matches 
    FROM table WHERE Matches IS NOT NULL 
) GROUP BY application, dstIP, dstPort ORDER BY Matches DESC; 

Matches列會統計所有列匹配或者是NULL時不匹配。

GROUP BY沒有集合函數將捕獲第一行(我希望!),這是最大匹配,因爲內部查詢排序降序。

編輯:新版本:

SELECT *, CASE WHEN application IS ? THEN 1 WHEN application IS NULL THEN 0 ELSE NULL END 
     + CASE WHEN dstIP IS ? THEN 1 WHEN dstIP IS NULL THEN 0 ELSE NULL END 
     + CASE WHEN dstPort IS ? THEN 1 WHEN dstPort IS NULL THEN 0 ELSE NULL END AS Matches 
FROM t 
WHERE Matches IS NOT NULL 
ORDER BY Matches DESC 
LIMIT 1; 

優點:可以比較NULL也。缺點:只有1場比賽在排名相同的比賽中找到。

+0

它看起來不錯,但我無法測試它。它說WHERE附近的語法錯誤。我對SQL很有經驗:( – BusDriverJoe

+0

Ups ...更正了基本語法錯誤,現在就試試! –

+0

我正在測試內部SELECT,看起來當一列沒有匹配時,因爲ELSE NULL分支,所以匹配列應該是2,但是它是NULL,但是我得到了這個基本的想法,給我一段時間=) – BusDriverJoe