SQL查询 - 仅在不存在完全匹配时使用Like?

时间:2008-09-16 19:07:50

标签: sql left-join

我遇到了当前使用

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

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

4 个答案:

答案 0 :(得分:1)

你在谈论短路评估。

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

我会选择一个If(从完全匹配计数= 0)然后执行查询,否则只使用完全匹配的结果。