instr()函数在安卓SQLITE中的使用?

3
我希望能够在我的现有Android SQLite数据库上执行以下操作,该数据库的结构如下所示: 列:id --- rule --- path --- someotherdata
现在,规则可能包含文件名的一部分(例如仅仅是“mypicture”这样的一些琐碎的内容,也可以是文件类型,如“jpg”)。我想编写一个查询,以获取包含输入字符串部分的所有规则。我已经尝试了以下示例: String value =“somepicturefilename.jpg”
我的语句:
"SELECT DISTINCT * FROM " + TABLE_RULES + " WHERE instr('"+ value + "',rule)!=0 ORDER BY " + KEY_ID+ " DESC;"

该语句是Java语言编写的,因此“value”应该插入到该语句中。

然而,这并不起作用。我对SQL或SQLite不太熟悉,有没有人可以给个提示?谢谢。

编辑:我还尝试过使用charindex,但也没有成功。

编辑:下面给出更详细的示例。给定以下数据库:

id --- rule ---
1      "jpg"
2     "ponies"
3     "gif"
4     "pdf"  

现在用户输入一个文件名,假设为“poniesAsUnicorns.jpg”。因此,“poniesAsUnicorns.jpg”是我的输入字符串,查询应匹配id#1和id#2,因为“poniesAsUnicorns.jpg”包含“jpg”和“ponies”。
希望这样能够澄清我的意思。
编辑: 以下是我尝试过的内容:
String statement = "SELECT DISTINCT * FROM " + TABLE_RULES
            + " WHERE charindex(rule,'" + value
            + "') > 0 ORDER BY " + KEY_ID + " DESC;";

但会抛出“未找到此操作”的异常。

如果您提供一个更详细的示例,说明您目前拥有什么以及您期望得到什么,那么回答会更容易些。 - Diego Torres Milano
新增了一个。感谢您的参与。 - Aeefire
这是崩溃了还是没有返回结果?Logcat 中有任何消息吗? - Moog
instr 抛出一个 SQL 异常,表示没有这样的操作。 - Aeefire
5个回答

3
据我所知,instr()函数不可用,因此您可以使用以下方法:
select * from table where replace("poniesAsUnicorns.jpg", rule, "") != "poniesAsUnicorns.jpg"; 

或者用于不区分大小写的匹配:

select * from table where replace(upper("poniesAsUnicorns.jpg"), upper(rule), "") != upper("poniesAsUnicorns.jpg");

哈哈,看起来它能完成任务!你知道它是否区分大小写吗? - Aeefire
可行的替代方案!谢谢 :) - 1111161171159459134

0
"SELECT DISTINCT * FROM " + TABLE_RULES + " WHERE rule LIKE '%"+ value + "%' ORDER BY " + KEY_ID+ " DESC;"

试试这个。


我已经尝试过这个了。但基本上我需要反过来。问题是...该列需要成为输入字符串的一部分(例如小于)。 参见: 04-24 00:37:38.057: D/RulesHelper(21328): found 0 entries by attribute:SELECT DISTINCT * FROM rules WHERE rule LIKE '%IMG_20130418_123133.jpg%' ORDER BY id DESC; - Aeefire

0

在LIKE模式中使用下划线(_)代替百分号(%)。下划线将匹配值中的任何单个字符,而不是整个字符串序列。

"SELECT DISTINCT * FROM " + TABLE_RULES + " WHERE rule LIKE '_"+ value + "_' ORDER BY " + KEY_ID+ " DESC;"

LIKE运算符


这并没有完成任务,因为正如我所说,我需要它反过来。04-24 09:23:28.555: D/RulesHelper(4399): 根据属性找到0个条目:SELECT DISTINCT * FROM rules WHERE rule LIKE 'IMG_20130418_124142.jpg' ORDER BY id DESC; - Aeefire

0

我看不出你的SQL表达式有什么问题...唯一可能导致它失败的是不在不等运算符!=周围加上空格。

试试这个:

"SELECT DISTINCT * FROM " + TABLE_RULES + " WHERE instr('"+ value + "',rule) > 0 ORDER BY " + KEY_ID+ " DESC;"

我不确定Android中的SQLite实现是否完整,您可能会发现某些操作无法正常工作,因此请进行一些简单的测试以确保其正确性。

如果这样仍然不起作用,您可以反转条件。

[field]='some_value'

和以下代码同样有效:

'some_value'=[field]

所以在你的例子中,我认为你应该能够做类似这样的事情:

select distinct * from TABLE_RULES
where 'poniesAsUnicorns.jpg' like '%' + rule + '%';

我在mySQL中测试了这个,它不喜欢使用+连接符,但是像这样工作得很顺利:

select distinct * from TABLE_RULES
where 'poniesAsUnicorns.jpg' like replace('%rule%','rule',rule);

我刚刚在SQLite manager中尝试了你的SQL查询,看起来没问题...我很困惑为什么这在Android中无效。 - Moog
嘿,我已经尝试了你的语句。 "like" 那个没起作用,因为我猜它把 "rule" 当作字符串而不是字段。至于 "like replace" 这个东西,我完全不理解...这应该做什么?用字段 "rule" 替换规则中的单词 "role" 吗?Oo - Aeefire
准确地说,它从第一部分中剥离出“规则”这个词,并将您的字段值(也称为规则)插入到空缺处。 - Moog

0
"SELECT DISTINCT * FROM " + TABLE_RULES + " WHERE '" + value + "' like '%' || rule || '%' ORDER BY " + KEY_ID + " DESC;"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接