我有一个sqlite表,其中包含可变长度编号前缀的记录。我希望能够以最有效的方式找到最完整的前缀与另一个可变长度的数字:
例如。该表包含一个名为prefix的列,其中包含以下数字:
1. 1234
2. 12345
3. 123456
有效的sqlite查询将查找第二条记录作为12345999的最完整匹配。
感谢。
答案 0 :(得分:6)
这里的一个巧妙的方法是反转一个LIKE子句 - 而不是说
WHERE prefix LIKE '...something...'
正如您经常做的那样,将前缀转换为模式,方法是在结尾添加%并将其作为固定字符串与输入进行比较。按前缀长度降序排序,然后选择前1个结果。
我之前从未使用过Sqlite,但只是下载了它,这很好用:
sqlite> CREATE TABLE whatever(prefix VARCHAR(100));
sqlite> INSERT INTO WHATEVER(prefix) VALUES ('1234');
sqlite> INSERT INTO WHATEVER(prefix) VALUES ('12345');
sqlite> INSERT INTO WHATEVER(prefix) VALUES ('123456');
sqlite> SELECT * FROM whatever WHERE '12345999' LIKE (prefix || '%')
ORDER BY length(prefix) DESC LIMIT 1;
输出:
12345
答案 1 :(得分:1)
select foo, 1 quality from bar where foo like "123*"
union
select foo, 2 quality from bar where foo like "1234*"
order by quality desc limit 1
我还没有对它进行测试,但这个想法适用于SQL的其他方言
答案 2 :(得分:1)
一些假设。
prefix_table.prefix
1234
12345
123456
etc.
foo.field
12345999
123999
select
a.field,
b.prefix,
max(len(b.prefix)) as length
from
foo a inner join prefix_table b on b.prefix = left(a.field, len(b.prefix))
group by
a.field,
b.prefix
请注意,这是未经测试的,但逻辑上应该有意义。
答案 3 :(得分:1)
如果不诉诸专业指数,最佳表现策略可能是寻找答案。
为每个可能的前缀发出LIKE查询,从最长的开始。返回行后停止。
这肯定不是实现你想要的最漂亮的方式,但与其他建议相反,查询计划程序将考虑索引。一如既往,这取决于您的实际数据。特别是,表中有多少行,以及平均搜索时间。
答案 4 :(得分:1)
我个人使用下一个方法,它将使用索引:
声明'('1','12','123','1234','12345','123459','1234599','12345999','123459999')' 应由客户
生成SELECT * FROM whatever WHERE prefix in
('1','12','123','1234','12345','123459','1234599','12345999','123459999')
ORDER BY length(prefix) DESC LIMIT 1;