我有一个 Firebird 数据库,我在其中查询“名称”以找到与我自己的游戏机器人匹配的游戏。 OCR(光学字符读取)是我自己创建的,工作原理如此。我现在正在采取措施提高其速度。
我的数据库中有大约 40,000 个“名字”,它们大多是唯一的,但举一个小例子
paradise of cup
Paradise when gone
paranoid
paradise
还有 40,000 多个
现在我正在寻找以下内容。 Firebird 对我想要完成的以下事情有任何支持吗?
当我使用上面的示例数据时,我的 OCR 需要找到至少 (Paradise *) = 10 个字母,以确保它始终是唯一的。
我不知道是否可以找到一种方法/查询,通过我的数据库进行某个/特定查询,以找出该查询的字母长度必须至少有多长,才能发现我的搜索始终是唯一的.
PS。我确实知道如果 SQL 中不支持此类内容,我可以自己编写脚本,但也许我可以在这里节省一些时间并学习一两件事。
我将您的问题读为“已知(可能是部分)值是否唯一标识一个名称”?很容易检查是否存在完全匹配:
SELECT COUNT(*)
FROM table
WHERE name = value
并且很容易检查该值是否部分匹配:
SELECT COUNT(*)
FROM table
WHERE name LIKE value||'%'
但是这个查询也计算完全匹配。因此,搜索“paradise%”将返回 3 - 两个部分匹配和一个完全匹配。这对您来说可能是个问题,我不知道。
这是一个 sql fiddle,其中包含用于测试的示例表、数据和 select 语句:http://sqlfiddle.com/#!2/21100b/1
我认为没有你问的这个功能。 你可以尝试这样问。 请注意,它不使用任何索引,因此您不应该过度滥用它。
create procedure get_min_distinct_length
returns (
min_length integer,
count_table integer,
count_spaces integer)
as
begin
min_length = 0;
count_table = 0;
count_spaces = 1;
while ((count_table <> count_spaces) and (min_length < 55)) do
begin
min_length = min_length + 1;
select count(distinct(word))
from table
into :count_table;
select count(distinct(substring(word from 1 for :min_length)))
from table
into :count_spaces;
end
suspend;
end
LIKE
或 STARTING WITH
:
SELECT theColumn
FROM theTable
WHERE theColumn LIKE 'theValue %'
或者
SELECT theColumn
FROM theTable
WHERE theColumn STARTING WITH 'theValue '
如果您对列建立索引,那么使用
STARTING WITH
可能会更好,因为优化器可以做出更明智的选择来使用索引。特别是如果您使用参数化查询,LIKE
将不会使用索引(因为它不知道您是否会传递类似“%...”的内容,而STARTING WITH
会。
如果您需要不区分大小写的搜索,请确保该列具有不区分大小写的排序规则(在创建索引之前)。