【问题标题】:SQL Query - Use Like only if no exact match exists?SQL 查询 - 仅在不存在完全匹配时才使用 Like?
【发布时间】:2010-09-09 16:51:25
【问题描述】:

我对当前使用的查询有疑问

LEFT JOIN weblog_data AS pwd 
  ON (pwd.field_id_41 != '' 
  AND pwd.field_id_41 LIKE CONCAT('%', ewd.field_id_32, '%'))

但是我发现只有在没有完全匹配的情况下才需要它。发生的情况是,由于使用了LIKE,查询是双重浸入,因此如果它首先测试完全匹配,那么它将避免双重浸入问题。谁能给我进一步的指导?

【问题讨论】:

    标签: sql left-join


    【解决方案1】:

    听起来您想首先基于精确匹配在您的 sn-p 中加入别名为 pwd 和 ewd 的表,如果失败,则基于您现在的相似比较。

    试试这个:

    LEFT JOIN weblog_data AS pwd1 ON (pwd.field_id_41 != '' AND pwd.field_id_41 = ewd.field_id_32)
    LEFT JOIN weblog_data AS pwd2 ON (pwd.field_id_41 != '' AND pwd.field_id_41 LIKE CONCAT('%', ewd.field_id_32, '%'))
    

    然后,在您的 select 子句中,使用如下内容:

    select
      isnull(pwd1.field, pwd2.field)
    

    但是,如果您正在处理 pwd 中可以为 null 的字段,这将导致问题,但这应该可以工作:

    select
      case pwd1.nonnullfield is null then pwd2.field else pwd1.field end
    

    您还必须确保进行分组,因为连接到 pwd2 仍会将行添加到您的结果集中,即使您最终忽略了其中的数据。

    【讨论】:

      【解决方案2】:

      我只能想到用代码来做。查找完全匹配,如果结果为空,则查找 LIKE。 另一个选项是此查询中的 WHERE,这样 WHERE ({count from exact match}=0),在这种情况下,如果完全匹配返回超过 0 个结果,它将不会与 LIKE 进行比较。但它的效率非常低……更不用说在代码中有意义地使用它相当困难。

      我会选择 If(count from exact match = 0) 然后做 like 查询,否则只使用完全匹配的结果。

      【讨论】:

        【解决方案3】:

        使用 TSQL,运行精确匹配,检查行数 == 0,如果是,则运行 like,否则不要运行 like 或在精确匹配下方添加 like 结果。

        【讨论】:

          【解决方案4】:

          你说的是短路评估。

          看看这篇文章,它可能会对你有所帮助: http://beingmarkcohen.com/?p=62

          【讨论】:

          • 我不明白这如何实现我正在寻找的东西。从示例中可以看出,SQL 足够聪明,可以避免无意义查询的额外循环。这看起来像如果 A 或 B,并且 A 为真,那么它继续前进。我需要它来做 A,如果 A 失败,做 B。
          • 抱歉,我只是重新阅读了几次问题,最后知道您想用精确匹配替换“喜欢”...
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-01
          • 2020-12-27
          相关资源
          最近更新 更多