我当前使用的查询有问题

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 中可能为空的字段,这会导致问题,但这应该可以工作:

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

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

其他提示

你说的是短路评估。

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

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

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

我会选择 If(精确匹配计数 = 0) 然后执行类似查询,否则只使用精确匹配的结果。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top