2013-08-22 40 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