好吧,让我尽可能仔细地解释一下
我有火鸟SQL数据库(Flamerobin),我查询"名字",找到一个匹配我自己的机器人的游戏。OCR(光学字符读取)是我自己创造的,工作如此之好!我正在采取措施提高它的速度
我的数据库中有大约40000个"名字",它们大多是唯一的,但给一个小例子
paradise of cup
Paradise when gone
paranoid
paradise
and 40.000 more
现在我正在寻找以下内容。SQL是否支持我想要完成的事情?
当我使用上面的示例数据时,我的OCR需要找到至少(Paradise *) = 10个字母,以确保它始终是唯一的。
现在我不知道我是否可以找到是否有一个方法/查询,有一个特定的/特定的查询通过我的数据库来找出这个查询必须至少有多长字母才能发现我的搜索总是唯一的。
提前感谢。
p。我知道如果SQL中不支持这样的事情,我可以自己编写脚本。但也许我可以在这里节省一些时间,学习一两件事
我读你的问题为"是否已知(可能是部分)值唯一标识一个名称"?很容易检查是否有精确匹配:
SELECT COUNT(*)
FROM table
WHERE name = value
并且很容易检查值是否部分匹配:
SELECT COUNT(*)
FROM table
WHERE name LIKE value||'%'
但是这个查询也计算精确匹配。因此,搜索"paradise%"将返回3——两个部分匹配和一个完全匹配。这可能是你的问题,我不知道。
下面是一个带有样例表、数据和选择语句的sql测试: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
将。
如果您需要不区分大小写的搜索,请确保该列具有不区分大小写的排序(在创建索引之前)。