【发布时间】:2020-03-11 18:36:36
【问题描述】:
假设我正在尝试在产品列表中搜索产品,因为有人在两个 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
这是我目前正在玩弄的,在WHERE 子句中加上或减去AND INSTR(UPPER(description), UPPER("PR")) != 0:
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
附言"||" 类似于 CONCAT() 对于那些来自不同 SQL 背景的人。
【问题讨论】:
-
为什么要使用 GROUP BY?您的要求不涉及聚合。此外,您必须澄清优先级的顺序。它们是否像查询中的 ORDER BY 子句的 CASE 表达式一样定义?
标签: android sqlite group-by android-sqlite sql-order-by