2

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

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

但是,我发现只有在没有完全匹配的情况下才需要它。正在发生的事情是由于使用 ,查询是双重浸入LIKE,所以如果它首先测试完全匹配,那么它将避免双重浸入问题。任何人都可以为我提供任何进一步的指导吗?

4

4 回答 4

2

听起来您想首先根据完全匹配在您的代码段中加入别名为 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 仍会将行添加到您的结果集中,即使您最终忽略了其中的数据。

于 2008-09-16T19:24:08.537 回答
1

你说的是短路评估。

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

于 2008-09-16T19:11:42.717 回答
1

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

于 2008-09-16T19:14:39.950 回答
0

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

我会去一个 If(count from exact match = 0) 然后做类似查询,否则只使用完全匹配的结果。

于 2008-09-16T19:16:26.857 回答