2013-08-22 64 views
0

在我的數據庫中,我有一個入口ABCCBAAC#sqlite的命令格式

我的查詢是這樣的:

string sql = SELECT * FROM signatures WHERE length(signature) BETWEEN 6 AND 8 AND signature LIKE ABCCBAA 
     OR length(signature) BETWEEN 6 AND 8 AND signature LIKE _BCCBAA 
     OR length(signature) BETWEEN 6 AND 8 AND signature LIKE A_CCBAA 
     OR length(signature) BETWEEN 6 AND 8 AND signature LIKE AB_CBAA 
     OR length(signature) BETWEEN 6 AND 8 AND signature LIKE ABC_BAA 
     OR length(signature) BETWEEN 6 AND 8 AND signature LIKE ABCC_AA 
     OR length(signature) BETWEEN 6 AND 8 AND signature LIKE ABCCB_A 
     OR length(signature) BETWEEN 6 AND 8 AND signature LIKE ABCCBA_ 

我經歷了很多的記錄本1個查詢搜索所以原諒矯枉過正。

我一直在嘗試這個查詢針對W3Schools的例子,它在放入上下文時工作正常。我知道我正在使用SQLite而不是SQL,但尚未完全使用語法。

我期望這些OR語句中的任何一個獲取結果,但由於語法錯誤,我甚至還沒有能夠執行它。爲什麼它是使用它作爲列名

:目前我得到

「ABCCBAA SQL邏輯錯誤或丟失的數據庫

沒有這樣的列」?其他例子讓我相信這個查詢是正確的。

我一直在玩這個很長一段時間,所以它可能是一些簡單的我沒有正確掌握。

+1

看起來你正在嘗試做一種模糊字符串匹配。可能有更好的方法,如果我是你,我會查找它,例如http://en.wikipedia.org/wiki/Approximate_string_matching –

+1

'_'匹配單個字符,因此您的查詢無法匹配不同長度的內容。 –

+0

@TimS。感謝您指點我模糊匹配,我會看到在sql查詢中可以做些什麼。關於長度,我已經用一些更難看的代碼來解決問題了:) – Rodney

回答

3

您需要引用字符串,例如:

WHERE length(signature) BETWEEN 6 AND 8 AND signature LIKE 'ABCCBAA' 

而且,你並不需要那麼多的OR length(signature) BETWEEN 6 AND 8。只是做一些事情:

string sql = @"SELECT * FROM signatures 
       WHERE length(signature) BETWEEN 6 AND 8 
       AND (signature LIKE 'ABCCBAA' OR signature LIKE '_BCCBAA' ...)"; 
+0

我試過這樣做,但得到了不同的語法錯誤,報價破壞了整個負載,並用.Replace(「'」 ,@「''」),或者作爲參數不起作用,它永遠不會正確映射。無論如何,我會再試一次。 – Rodney

+1

而不是轉義,你應該使用SQL參數 –

+0

那麼這是愚蠢的......通過正確的參數化解決了我所有的問題。感謝提示,我會看看我可以做些什麼來使它不醜。 – Rodney