我遇到了当前使用
的查询的问题LEFT JOIN weblog_data AS pwd
ON (pwd.field_id_41 != ''
AND pwd.field_id_41 LIKE CONCAT('%', ewd.field_id_32, '%'))
然而,我发现如果首先没有完全匹配,我只需要使用它。发生的事情是由于使用了LIKE
,查询是双重浸入,所以如果它首先测试完全匹配,那么它将避免双重浸渍问题。任何人都可以向我提供任何进一步的指导吗?
答案 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)然后执行查询,否则只使用完全匹配的结果。