编写查询以删除sqlite中特殊记录上的4个首字母

我的原始代码是:

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

,它返回了完整的记录,如下面的照片。 enter image description here

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

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”)的记录,并且它不应该这样。它必须返回仅包含搜索字符的记录。在照片中,您可以看到它返回了带有前缀。All these words started with 'das '的记录。 在第二个代码之后搜索“ das”时,应返回在主体上包含das而不是在已删除前缀上的单词。我希望我能解释清楚。

zhouyu2020 回答:编写查询以删除sqlite中特殊记录上的4个首字母

在SQLite中,串联运算符为||,而不是+
另外,请勿直接连接参数search,而应使用?占位符,并在search的第二个参数处传递rawQuery()。这是避免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子句中的WHERE列是CASE表达式的结果,则将该语句更改为:

String sql = "select t.* from (select dId,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});
本文链接:https://www.f2er.com/3100221.html

大家都在问