【问题标题】:Looping through Where statement until a result is found (SQL)循环遍历 Where 语句直到找到结果 (SQL)
【发布时间】:2018-05-03 02:36:09
【问题描述】:

问题总结:

我正在使用 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 * generic 并在您的 sql 中计算一个“分数”——程序只会使用最高分数——但你会得到更多必须过滤的结果——这将导致对D b。最高分将达到 3*exact,其次是任何 2*exact 和 1*generic 等
  • @GordonLinoff 我无法控制数据库的问题。描述列包含三个产品的名称(三个关键字)。产品名称由多个用户输入数据库,他们通常以不同的方式编写产品(灵活命名法)。例如,如果我们的产品是 iPhone,我对 iPhone X 感兴趣作为关键字 1,它可以写成:iPhone X 或 iPhone 10 或 iPhone-10 或 iPhone10 或 iPhone-X 但如果没有找到,我会说“iPhone”是最通用的。其他两个关键字用于附带的附加组件,也可以用不同的方式编写。
  • 您是真的在不同的表中搜索还是在单个表中搜索行?
  • @OlivierJacot-Descombes 单表。

标签: python sql sql-server sql-like


【解决方案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

【讨论】:

    【解决方案2】:

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

    Select * 
    From MyTable
    Where Description LIKE '%iPhone%'
    

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

    如果您有几个同样通用的关键字,则使用 OR 查询它们

    Select * 
    From MyTable
    Where Description LIKE '%iPhone%' OR
          Description LIKE '%i-Phone%'
    

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

    【讨论】:

    • 我没有尝试使用三个通用词(肯定会返回大量数据)然后在Python中处理它们。我试试看会不会更快。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-08
      • 2021-12-14
      • 1970-01-01
      • 2015-02-07
      • 2016-07-12
      • 1970-01-01
      • 2013-09-14
      相关资源
      最近更新 更多