我对当前使用的查询有疑问
LEFT JOIN weblog_data AS pwd
ON (pwd.field_id_41 != ''
AND pwd.field_id_41 LIKE CONCAT('%', ewd.field_id_32, '%'))
但是,我发现只有在没有完全匹配的情况下才需要它。正在发生的事情是由于使用 ,查询是双重浸入LIKE
,所以如果它首先测试完全匹配,那么它将避免双重浸入问题。任何人都可以为我提供任何进一步的指导吗?
听起来您想首先根据完全匹配在您的代码段中加入别名为 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 仍会将行添加到您的结果集中,即使您最终忽略了其中的数据。
你说的是短路评估。
看看这篇文章可能对你有帮助: http ://beingmarkcohen.com/?p=62
使用 TSQL,运行精确匹配,检查行数 == 0,如果是,则运行类似,否则不要运行类似或在精确匹配下方添加类似结果。
我只能想到用代码来做。查找完全匹配,如果结果为空,则查找 LIKE。另一个选项是此查询中的 WHERE,例如 WHERE ({count from exact match}=0),在这种情况下,如果完全匹配返回超过 0 个结果,它将不会与 LIKE 进行比较。但它的效率非常低……更不用说在代码中有意义地使用它是相当困难的。
我会去一个 If(count from exact match = 0) 然后做类似查询,否则只使用完全匹配的结果。