问题总结:
我正在使用 Python 从循环中向数据库发送一系列查询(一个接一个),直到找到非空结果集。该查询具有三个必须满足的条件,它们位于 where 语句中。循环的每次迭代都会将条件从特定条件更改和操纵为更通用的条件。
详情:
假设条件是基于按准确性排序的预制列表的关键字,例如:
Option KEYWORD1 KEYWORD2 KEYWORD3
1 exact exact exact # most accurate!
2 generic exact exact # accurate
3 generic generic exact # close enough
4 generic generic generic # close
5 generic+ generic generic # almost there
.... and so on.
在数据库方面,我有一个描述列,其中应包含所有三个关键字的特定形式或通用形式。当我在 python 中运行循环时,这是实际发生的情况:
-- The first sql statement will be like
Select *
From MyTable
Where Description LIKE 'keyword1-exact$'
AND Description LIKE 'keyword2-exact%'
AND Description LIKE 'keyword3-exact%'
-- if no results, the second sql statement will be like
Select *
From MyTable
Where Description LIKE 'keyword1-generic%'
AND Description LIKE 'keyword2-exact%'
AND Description LIKE 'keyword3-exact%'
-- if no results, the third sql statement will be like
Select *
From MyTable
Where Description LIKE 'keyword1-generic%'
AND Description LIKE 'keyword2-generic%'
AND Description LIKE 'keyword3-exact%'
-- and so on until a non-empty result set is found or all keywords were used
我正在使用上面的方法来获得最准确的结果和最少数量的不相关的结果(关键字越通用,越不相关的结果就会出现,它们将需要额外的处理)
问题:
我上面的方法完全符合我的要求,但我确信它效率不高。
在查询而不是 Python 循环中执行此操作的正确方法是什么(知道我只有对数据库的读取权限,所以我不能存储过程)?
这是一个想法
select top 1
*
from
(
select
MyTable.*,
accuracy = case when description like keyword1 + '%'
and description like keyword2 + '%'
and description like keyword3 + '%'
then accuracy
end
-- an example of data from MyTable
from (select description = 'exact') MyTable
cross join
(values
-- generate full list like this in python
-- or read it from a table if it is in database
(1, ('exact'), ('exact'), ('exact')),
(2, ('generic'), ('exact'), ('exact')),
(3, ('generic'), ('generic'), ('exact'))
) t(accuracy, keyword1, keyword2, keyword3)
) t
where accuracy is not null
order by accuracy
我是一名优秀的程序员,十分优秀!