SQL查询-仅当不存在完全匹配项时才使用"喜欢"吗?
时间:2020-03-05 18:56:53 来源:igfitidea点击:
我目前使用的查询有问题
LEFT JOIN weblog_data AS pwd ON (pwd.field_id_41 != '' AND pwd.field_id_41 LIKE CONCAT('%', ewd.field_id_32, '%'))
但是我发现只有在没有完全匹配的情况下才需要使用它。发生的情况是由于使用了LIKE而使查询处于两次浸渍状态,因此,如果先测试完全匹配项,则可以避免两次浸渍问题。谁能为我提供任何进一步的指导?
解决方案
回答
我们正在谈论短路评估。
看一下这篇文章可能对我们有帮助:
http://beingmarkcohen.com/?p=62
回答
使用TSQL,运行完全匹配,检查行数== 0,如果是,则运行like,否则不要运行like或者在完全匹配下方添加like结果。
回答
我只能想到用代码来做到这一点。查找完全匹配,如果结果为空,则查找LIKE。
另一种选择是此查询中的WHERE,以使WHERE({精确匹配计数} = 0)在这种情况下,如果精确匹配返回的结果大于0,则不会与LIKE进行比较。但是它的效率极低……更不用说在代码中有意义地使用它的事实了。
我会去一个If(来自完全匹配的计数= 0)然后做查询,否则只使用来自完全匹配的结果。
回答
听起来我们好像想首先基于完全匹配将别名为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的联接仍会向结果集中添加行,即使最终我们忽略了其中的数据也是如此。