循环遍历Where语句直到找到结果(SQL)

时间:2017-11-19 22:03:18

标签: python sql sql-server sql-like

问题摘要:

我正在使用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循环中执行此操作的正确方法是什么(知道我只有对数据库的读访问权限,因此我无法存储过程)?

3 个答案:

答案 0 :(得分:1)

这是一个想法

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

答案 1 :(得分:0)

我不会对数据库查询进行循环。相反,我会搜索最不具体的,即最通用的关键字,并返回所有这些行。

def set_speed(val):
    global speed
    speed = val
    # ... whatever other logic you'd like to perform

def set_angle(val):
    # ...

这将返回包含iPhone的所有行。现在在内存中进行进一步处理,即找到最佳匹配。这比多次查询要快得多。

如果您有几个同等最通用的关键字,请使用OR

查询它们
Select * 
From MyTable
Where Description LIKE '%iPhone%'

但是任何情况下只能进行一次查询。

答案 2 :(得分:0)

请尝试使用Sql server的RegEx正则表达式功能。 否则你可以尝试在python中使用re来进行正则表达式。 首先,您可以收集数据,然后尝试重新实现目标。 希望这有用。