android - 确定 SQLite GROUP BY 行选择
问题描述
假设我正在尝试在产品列表中搜索产品,因为有人在两个 AutoCompleteTextViews 中键入。在这种情况下,假设制造商中的“H”和描述中的“PR”
现在,数据库有 HP 打印机,还有 HP 笔记本电脑、服务器等。此外,假设有一个像 Hitachi 这样的制造商,其中有一个 H,但我当前的数据库没有任何打印机,但它确实有一些 Hitachi 条目也许是扫描仪。
所以,这大致是我觉得合乎逻辑的结果顺序:
- 首先匹配两列。也许用户正在搜索 HP 打印机,它应该是第一个,因为在两列中匹配,从字符串开头 (
LIKE "x%"
) 开始按最佳字母匹配顺序排列。 - 描述列中的匹配项。也许两者都不匹配,所以在那之后我想列出每个连接有打印机的制造商。
- 制造商列中的匹配项从最佳字母匹配开始。也许用户想在数据库中输入一台新的日立品牌打印机,所以我想提出这个建议。
所以,假设他们为打印机输入了 PR,在 HP/Hitachi 的开头输入了 H。我可以过滤掉除打印机之外的所有内容,所以我的结果是:
HP | Printer
RICOH | Printer
BROTHER | Printer
但是我没有日立。
或者我可以取出description
过滤器并列出每个制造商,首先按制造商描述匹配排序,然后得到如下内容:
RICOH | Printer
BROTHER | Printer
HAIER | TV
HITACHI | Scanner
HP | PC
HON | Filing Cabinet
现在GROUP BY
已分组到包含 HP 但用于 PC 而非打印机的行中,因此稍后将对其进行分类。
有什么方法可以过滤 GROUP BY 选择的行吗?我假设它只是抓住了第一个结果。这就是我想要的样子:
HP | Printer
RICOH | Printer
BROTHER | Printer
HAIER | TV
HITACHI | Scanner
HON | Filing Cabinet
这是我目前正在玩弄的,AND INSTR(UPPER(description), UPPER("PR")) != 0
在WHERE
子句中加上或减去一个:
SELECT _id, manufacturer, description
FROM `tblProducts`
WHERE (manufacturer || description) IN
(
SELECT (manufacturer || description)
FROM `tblProducts`
WHERE INSTR(UPPER(manufacturer), UPPER("H")) != 0
GROUP BY manufacturer, description
)
GROUP BY manufacturer
ORDER BY
CASE
WHEN INSTR(UPPER(description), "PR") != 0 AND UPPER(manufacturer) LIKE "H%"
THEN 1
WHEN INSTR(UPPER(description), "PR") != 0 AND INSTR(UPPER(manufacturer), "H") != 0
THEN 2
WHEN INSTR(UPPER(manufacturer), "H") != 0
THEN 3
WHEN INSTR(UPPER(description), "PR") != 0
THEN 4
ELSE 5
END ASC
ps " ||
" 类似于CONCAT()
那些来自不同 SQL 背景的人。
解决方案
我认为您不需要如此复杂的查询。
使用CASE
查询中的该表达式来定义优先级,以便您可以过滤和排序:
SELECT t._id, t.manufacturer, t.description
FROM (
SELECT _id, manufacturer, description,
CASE
WHEN INSTR(UPPER(description), "PR") != 0 AND UPPER(manufacturer) LIKE "H%" THEN 1
WHEN INSTR(UPPER(description), "PR") != 0 AND INSTR(UPPER(manufacturer), "H") != 0 THEN 2
WHEN INSTR(UPPER(manufacturer), "H") != 0 THEN 3
WHEN INSTR(UPPER(description), "PR") != 0 THEN 4
ELSE 5
END priority
FROM `tblProducts`
) t
WHERE t.priority <= 4
ORDER BY t.priority
将"PR"
和替换"H"
为用户键入的值。
推荐阅读
- json - 如何在 Symfony 4 中使用通过 Ajax 加载的表单将数据保存在数据库中?
- c# - 在 AutoMapper 中映射嵌套不同类型具有不同属性名称的嵌套对象
- maven - 如何使用 liberty-maven-plugin 在后台以调试模式启动 Liberty 服务器?
- javascript - 如何使用cordova-plugin-dialogs?
- bash - Unix 将行转换为列
- c# - 将一个数据表的内容复制到另一个数据表而不使用克隆或复制
- scala - 当成员包含通过反射评估的惰性值时,RDD 上的操作将在单个节点上执行
- ios - 如何在swift中实现有角度的butterbar效果?
- c# - 如何检查特定服务器(非本地)是否可以使用 Web 服务(端点)
- android - 时区更改后日历错误时间