首页 > 解决方案 > 编写查询以删除 sqlite 中特殊记录上的 4 个首字母

问题描述

我的原始代码是:

 c = mydb.rawQuery("select dId,dWord FROM german where dWord like '%" + search + "%'", null);

它返回完整的记录,如下图所示。 在此处输入图像描述

我将代码更改为遵循代码,但它也有问题。

c = mydb.rawQuery("select dId, case when substr(dWord, 1, 4) in ('das ', 'der ','die ') then substr(dWord, 5, length(dWord) - 4) else dWord end as dWord from german where dWord like '%"+search+"%'",null);

它不显示 4 个字母,这很好,但它显示了具有此前缀('das','der','die')的记录,它不应该是这样的。它必须返回只包含搜索字符的记录。在照片中,您可以看到它返回了带有前缀的记录。所有这些词都以“das”开头, 在第二个代码之后搜索“das”,它应该返回在其主体上包含 das 的词,而不是在删除的前缀上。我希望我能解释清楚。

标签: javaandroidsqlsqliteandroid-sqlite

解决方案


在 SQLite 中,连接运算符 is||和 not +
也不要直接连接参数search,而是使用?占位符并searchrawQuery(). 这是避免sql-injection的安全方法:

String sql = "select dId, " + 
   "case when substr(dWord, 1, 4) in ('das ', 'der ','die ') " + 
   "then substr(dWord, 5) else dWord end as dWord " +
   "from german where dWord like '%' || ? || '%'";
c = mydb.rawQuery(sql, new String[] {search});


如果子句中的该dWord列是表达式的结果,则将语句更改为:WHERECASE

String sql = "select t.* from (select dId, " + 
   "case when substr(dWord, 1, 4) in ('das ', 'der ','die ') " + 
   "then substr(dWord, 5) else dWord end as dWord " +
   "from german) t where t.dWord like '%' || ? || '%' " +
   "order by instr(t.dWord, ?), t.dWord"
c = mydb.rawQuery(sql, new String[] {search, search});

推荐阅读