java - 编写查询以删除 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 的词,而不是在删除的前缀上。我希望我能解释清楚。
解决方案
在 SQLite 中,连接运算符 is||
和 not +
。
也不要直接连接参数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, " +
"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});
推荐阅读
- python - 如何在 Python 中格式化金字塔的两位数行?
- java - Spring项目中的HSQLDB持久化
- tensorflow - 张量流损失中样本权重的反向传播效应
- arrays - 如何使用 switch 语句将字符串值分配给变量
- excel - 在 excel 或 power bi 中查找开始日期和结束日期之间的小时数?
- javascript - Nuxtjs 动态路由在“完全静态”时不接受有效负载
- javascript - 过滤除函数之外的所有内容
- javascript - ThingsBoard:如何将确认框添加到开关控制小部件(tb-switch)?
- c++ - 开关不携带部分输入?
- java - 是否可以使用不同的类型参数将谓词与`and`链接起来?